Alles maskieren, indem du seinen Namen tippst: Florence-2-Maskierung und Inpainting in ComfyUI

Tippe „crown“, „tiger“ oder „glasses“, und Florence 2 liefert eine Maske. Baue den Workflow in ComfyUI, bearbeite den maskierten Bereich per Inpainting mit SD 1.5, kombiniere zwei Masken zu einer und verwandle eine Maske in einen Rand.

Anton Tenitsky13. Oktober 20267 Min. LesezeitVideoversion unten

Diese Anleitung wurde mit KI aus dem Englischen übersetzt und kann Fehler enthalten. Zum Original.

Ein weißer Totenkopf mit einer Krone, die Krone durch eine textgesteuerte Florence-2-Maske grün hervorgehoben

Tippe „t-shirt“, und du bekommst eine Maske des T-Shirts. Tippe „face“, „bookshelf“ oder „wall“, und du bekommst diese. Florence 2 ist ein Vision-Modell von Microsoft, das Objekte anhand einer Textbeschreibung finden kann, und in ComfyUI macht es daraus eine Maske, die du per Inpainting bearbeiten kannst. Es ist ziemlich unglaublich, was es kann, aber es hat Einschränkungen, und auch darauf gehe ich ein.

Florence 2 wird in dem Aufsatz Florence-2: Advancing a Unified Representation for a Variety of Vision Tasks (Xiao et al., 2023) beschrieben. Es ist ein Forschungsmodell für viele Aufgaben (Beschriftung, Objekterkennung, Segmentierung und mehr); hier nutze ich es nur für Masken.

Kurz gefasst

  • Nodes: ComfyUI-Florence2 (von Kijai), ComfyUI Essentials, Universal Styler für Textausgabe, rgthree zum Vergleichen.
  • Modell: Florence-2-large für die besten Masken; base als Ausweichlösung.
  • Aufgabe: referring_expression_segmentation, dann tippe, was maskiert werden soll.
  • Inpaint: InpaintModelConditioning mit dem Original-Bild und der Maske; Denoise etwa 0,5–0,62.
  • Masken lassen sich kombinieren: Mask Composite (add) verbindet zwei Masken; Grow Mask plus multiply macht einen Rand.

Neu bei ComfyUI? Beginne mit ComfyUI-Node-Grundlagen und Text-zu-Bild und den ComfyUI Manager installieren. Der fertige Workflow ist kostenlos auf meinem Patreon: Ziehe die JSON hinein und installiere die fehlenden Nodes über den Manager.

Die Nodes installieren

Installiere unter Manager → Custom Nodes Manager:

  1. ComfyUI Essentials, eine grundlegende Sammlung von Nodes, die du wirklich brauchst (Mask Preview, Image Resize und mehr).
  2. ComfyUI Universal Styler, das hilft, Text herauszubekommen (sein Node Get Text zeigt Florence’ Beschriftungen).
  3. Florence 2. Es gibt zwei Pakete, von Kijai und von spacepxl. Kijais hat mehr Sterne und wurde kürzlich aktualisiert. Die beiden sind sich sehr ähnlich, aber ich musste einen Teil des Codes von spacepxl umschreiben, um ihn im neuesten ComfyUI auszuführen. Bleib bei Kijais.

Starte ComfyUI nach der Installation neu.

Den Florence-2-Teil bauen

  1. Füge DownloadAndLoadFlorence2Model hinzu. Es lädt das Modell beim ersten Ausführen automatisch herunter, also gibt es kein git clone und keine Suche nach Modellordnern.
  2. Füge Florence2Run hinzu und verbinde das Modell.
  3. Füge Load Image mit deinem Bild hinzu, in den Bild-Eingang von Florence2Run.
  4. Verbinde alle Ausgänge: ein Preview Image für das Bild, ein Mask Preview (aus Essentials) für die Maske und einen Get Text-Node für die Beschriftung. Wenn ein Ausgang nicht verbunden ist, läuft das Netz nicht, und das Modell wird nicht heruntergeladen.
Load Image mit einem Tigerfoto, das den Node Florence2Run mit der Aufgabe referring_expression_segmentation und dem Prompt tiger speist, mit der Maskenvorschau, die die Silhouette des Tigers zeigt
Das Kern-Setup: Modell-Loader, Florence2Run mit einem Text-Prompt und Vorschauen an jedem Ausgang.

Klicke auf Queue. Der erste Durchlauf lädt das Modell herunter, was je nach Verbindung ein paar Minuten oder länger dauern kann; du kannst es im Befehlsfenster verfolgen. Die Standardaufgabe findet die Objekte im Bild und zeichnet um jedes eine Begrenzungsbox (hier: eine Krone und einen Totenkopf). Begrenzungsboxen sind dafür nicht so nützlich; richtige Masken schon.

Ein Totenkopf mit Krone und von Florence 2 gezeichneten Begrenzungsboxen
Die Standardaufgabe: Begrenzungsboxen um die Objekte, die es erkennt.

Das Modell wählen

  • Florence-2-base: der Standard.
  • Florence-2-base-ft / large-ft: „ft“ bedeutet für bestimmte Zwecke feinabgestimmt. Ich empfehle sie nicht; sie lieferten schlechtere Ergebnisse als base.
  • Florence-2-large: sehr empfehlenswert. Es braucht pro Bild deutlich länger, macht aber viel bessere Masken.

Die Aufgabe wählen

Die Liste task ist die wichtigste Einstellung. Stelle sie auf caption, und es beschreibt das Bild; bei mir erschien der Text auf dieser Maschine nicht im Node Get Text, obwohl er im Befehlsfenster auftauchte und auf einer anderen Maschine funktionierte. Beschriftungen sind hier ohnehin nicht das Ziel.

Die Aufgabe, die du fast immer nutzen wirst, ist referring_expression_segmentation. Tippe ins Textfeld, was du willst, führe aus, und du bekommst eine Maske.

Das Totenkopfbild mit der in Grün maskierten Krone
„Crown“: Die Maske deckt die ganze Krone ab und sonst nichts.

„Skull“ lieferte gleich eine schöne Maske. „Crown“ zunächst nicht: KI-Modelle sind nicht perfekt, und das passiert von Zeit zu Zeit. Als ich vom large zurück auf base wechselte und denselben Prompt ausführte, bekam ich eine gute Kronen-Maske. Gelegentlich die Modelle zu tauschen, gehört zum Prozess.

Den maskierten Bereich per Inpainting bearbeiten

  1. Füge InpaintModelConditioning hinzu. Verbinde die mask von Florence2Run und das Bild aus deinem ursprünglichen Load Image, nicht aus Florence2Run: Die Bildausgabe von Florence hat die farbige Maske aufgemalt.
  2. Baue eine Standardkette für Text zu Bild: Load Checkpoint (ich nutze epiCPhotoGasm), ein positives und ein negatives CLIP Text Encode (ich färbe sie grün und rot), einen KSampler, VAE Decode und Save Image.
  3. Leite die Prompts zuerst durch InpaintModelConditioning, dann in den KSampler. Verbinde das VAE mit InpaintModelConditioning und seinen Ausgang latent mit dem Latent-Eingang des KSampler.
  4. Tippe die gewünschte Änderung („silver“ für die Krone) und setze das Denoise auf etwa 0,62. Das Denoise steuert die Mischung zwischen Prompt und Originalbild und ist hier der wichtigste Wert.

Wenn es sich über eine fehlende VAE-Verbindung beschwert, ziehe eine hinüber. Das Ergebnis:

Der Totenkopf, der nun eine verzierte Silberkrone trägt, neben einem rgthree-Image-Comparer-Node
Nur die Krone ändert sich: Silber statt Gold, gewählt durch Tippen von zwei Wörtern.

Um zu vergleichen, füge einen Image Comparer von rgthree hinzu, mit dem neuen Bild als A und dem Original als B. Du musst erneut ausführen, um ihn zu aktivieren, was ein anderes Ergebnis liefert.

Zwei Masken kombinieren: der ganze Tiger

Bei einem Tigerfoto von Fotoref (dem Fotoarchiv, das ich mitgegründet habe) maskierte „tiger“ die Vorderseite des Körpers, verfehlte aber das Hinterbein. Umgehe die Inpainting-Nodes (wähle sie aus und drücke Strg+B), während du Masken testest.

  1. Kopiere den Florence-Zweig mit Strg+C, Strg+Umschalt+V, was die Verbindungen beibehält. Gib ihm dieselben Ausgabe-Nodes (Vorschau, Maskenvorschau, Get Text); ohne sie läuft er nicht, auch wenn du sie nicht nutzt.
  2. Probiere Prompts für den fehlenden Teil. „Tiger back leg“ funktionierte nicht. Mit dem large-Modell und einem kreativeren Prompt, „tiger black stripes front and back“, bekam ich das Hinterbein. Ich habe etwa zehn Prompts probiert, um dorthin zu kommen.
  3. Füge Mask Composite hinzu: eine Maske in destination, die andere in source (sie sollten eigentlich einfach A und B heißen), Operation add, da du Weiß zu Weiß addierst. Multiply würde alles entfernen.
  4. Sieh dir die kombinierte Maske in der Vorschau an: der ganze Tiger.
Der zweite Florence-Zweig mit dem in Grün hervorgehobenen Tiger und einer Maskenvorschau der vollständigen Tigersilhouette
Der zweite Prompt erfasst das Hinterbein; zusammen decken die Masken den ganzen Tiger ab.

Hebe die Umgehung der Inpainting-Nodes auf und verbinde die zusammengesetzte Maske mit InpaintModelConditioning. Ich habe vergessen, den Prompt zu ändern, und bekam einen silbernen Tiger. Mit „cat“ machte es eine Katze, und sie fügte sich gut ein: Es ersetzte den unteren Teil des Körpers durch nahe Vegetation und setzte einen Stein unter eine Pfote. Es ist nicht weit von einer großartigen Generierung entfernt; es braucht mehr Durchläufe.

Der Tiger, ersetzt durch eine getigerte Katze, die durch dieselbe Dschungelszene läuft
„Cat“ anstelle des Tigers, in die umgebenden Pflanzen eingefügt.

Gesichter

Bei einer meiner 3D-Skulpturen lieferte „face“ eine Maske des Gesichts. Mit dem Prompt „male“ malte es das Gesicht einer anderen Person hinein. Bei Denoise 0,25 sah das Ergebnis dem Original ähnlicher, auch wenn es mit der seltsamen Anatomie zu kämpfen hatte, die ich modelliert hatte (Hörner, ein Piercing unten), und sie durch einen Bart ersetzte, was zu erwarten ist.

Tipp: Florence2Run hat einen Seed. Ändere control_after_generate von randomize auf fixed, damit die Maske nicht jedes Mal neu erzeugt wird, wenn du einen neuen Prompt probierst.

Eine Maske in einen Rand verwandeln

Bei einem Selfie lieferte „glasses“ eine ziemlich ordentliche Maske. Aber ich wollte nur die Fassung ändern, und die ist zu dünn, als dass Florence sie aus einem Prompt maskieren könnte. Klassische Masken-Nodes können das stattdessen:

  1. Invert Mask (ein Kern-Node) auf die Brillenmaske.
  2. Grow Mask um 10 Pixel. Bei der invertierten Maske wächst das Weiß und das Schwarz schrumpft.
  3. Mask Composite mit der vergrößerten Maske als destination und der ursprünglichen Maske als source, Operation multiply. Das zieht eine von der anderen ab und lässt den Rand der Fassung übrig.
  4. Füge unterwegs Mask-Preview-Nodes hinzu, um jeden Schritt zu sehen.
Grow Mask mit Expansion 10, das ein Mask Composite auf multiply speist, mit invertierten und geschrumpften Brillenmasken in den Vorschauen
Invertieren, um 10 px vergrößern, multiplizieren: Die Differenz ist ein dünner Rand.

Ich habe diesen Rand mit „silver“ als Prompt bei Denoise 0,5 mit InpaintModelConditioning verbunden. Ehrlich gesagt bekam ich hier kein wirklich gutes Ergebnis, trotz verschiedener Denoise-Werte und Prompts. Es geht um die Technik: eine Maske aus einem Prompt gewinnen und dann dieselben Tricks zum Vergrößern und Abziehen anwenden, die du in jeder VFX- oder Compositing-App nutzen würdest.

Nächste Schritte

Für schwereres Inpainting mit einem stärkeren Modell siehe Inpainting mit Flux. Um Gesichter und Hände zu korrigieren, ohne überhaupt Masken zu zeichnen, siehe KI-Gesichter und -Hände automatisch korrigieren. Masken helfen auch der IPAdapter-Stilübertragung, sich auf ein Motiv zu konzentrieren.

Die Videoversion ansehen (15:54)

Alles oben steht auch im Video, falls du lieber am Bildschirm mitmachst. Das Video ist auf Englisch.

Häufige Fragen

Welches Florence-2-Modell sollte ich für Masken nutzen?

Florence-2-large liefert viel bessere Masken als base, braucht aber länger. Die feinabgestimmten Versionen (ft) lieferten in meinen Tests schlechtere Ergebnisse als base. Wenn large etwas verfehlt, probiere base mit demselben Prompt; manchmal klappt es.

Welche Florence-2-Aufgabe erzeugt Masken aus einem Text-Prompt?

referring_expression_segmentation. Tippe, was du maskieren willst, in das Textfeld des Nodes Florence2Run.

Florence 2 hat nur einen Teil des Objekts maskiert. Was kann ich tun?

Maskiere den fehlenden Teil mit einem zweiten Prompt (oder einem anderen Modell) und verbinde dann die beiden Masken mit einem Node Mask Composite auf add.

Warum ändert sich die Maske bei jedem Durchlauf?

Florence2Run hat einen eigenen Seed. Stelle control_after_generate von randomize auf fixed, damit die Maske gleich bleibt, während du verschiedene Inpainting-Prompts probierst.

Anton Tenitsky ist 3D-Artist mit mehr als 15 Jahren Erfahrung in der Computergrafik, tätig für Nickelodeon, Gameloft, Marvel Rivals und viele weitere Kunden. Mehr über mich

Ähnliche Anleitungen