Wir entwerfen eine neue Architektur, die mehr als 10 Steuerungstypen bei der Text-zu-Bild-Generierung von Bedingungen unterstützen und hochauflösende Bilder erzeugen kann, die visuell mit Midjourney vergleichbar sind . Das Netzwerk basiert auf der ursprünglichen ControlNet-Architektur. Wir schlagen zwei neue Module vor, um: 1 das ursprüngliche ControlNet zu erweitern, um unterschiedliche Bildbedingungen mit demselben Netzwerkparameter zu unterstützen. 2 Unterstützt die Eingabe mehrerer Bedingungen, ohne den Rechenaufwand zu erhöhen. Dies ist besonders wichtig für Designer, die Bilder im Detail bearbeiten möchten. Verschiedene Bedingungen verwenden denselben Bedingungsencoder, ohne zusätzliche Berechnungen oder Parameter hinzuzufügen. Wir führen gründliche Experimente mit SDXL durch und erzielen sowohl hinsichtlich der Kontrollfähigkeit als auch der ästhetischen Bewertung eine überlegene Leistung. Wir geben die Methode und das Modell für die Open-Source-Community frei, damit jeder Freude daran haben kann.
Wenn Sie es nützlich finden, geben Sie mir bitte einen Stern. Vielen Dank!!
Die SDXL ProMax-Version wurde veröffentlicht!!! Viel Spaß damit!!!
Es tut mir leid, dass Einnahmen und Ausgaben des Projekts schwer auszubalancieren sind. Daher werden die GPU-Ressourcen anderen Projekten zugewiesen, die mit größerer Wahrscheinlichkeit profitabel sind. Das SD3-Training wird gestoppt, bis ich genügend GPU-Unterstützung gefunden habe. Ich werde mein Bestes geben Finden Sie GPUs, um das Training fortzusetzen. Sollten Ihnen dadurch Unannehmlichkeiten entstehen, entschuldige ich mich aufrichtig dafür. Ich möchte mich bei allen bedanken, denen dieses Projekt gefällt. Ihre Unterstützung ist das, was mich am Laufen hält
Hinweis: Wir haben das Promax-Modell mit einem Promax-Suffix in dasselbe Huggingface-Modell-Repo eingefügt. Detaillierte Anweisungen werden später hinzugefügt.
Das folgende Beispiel zeigt eine Auflösung von 1M -> 9M Auflösung
Verwenden Sie Bucket-Training wie Novelai, um hochauflösende Bilder mit jedem Seitenverhältnis zu erzeugen
Verwenden Sie große Mengen hochwertiger Daten (über 1.000.000 Bilder), der Datensatz deckt eine Vielzahl von Situationen ab
Verwenden Sie neu betitelte Eingabeaufforderungen wie DALLE.3, verwenden Sie CogVLM, um eine detaillierte Beschreibung zu generieren, und bieten Sie eine gute Möglichkeit, Eingabeaufforderungen zu verfolgen
Nutzen Sie beim Training viele nützliche Tricks. Einschließlich, aber nicht beschränkt auf Datumserweiterung, Mehrfachverlust, Mehrfachauflösung
Verwenden Sie fast die gleichen Parameter wie beim Original-ControlNet. Keine offensichtliche Erhöhung der Netzwerkparameter oder der Berechnung.
Unterstützt mehr als 10 Kontrollbedingungen, kein offensichtlicher Leistungsabfall bei einer einzelnen Bedingung im Vergleich zum unabhängigen Training
Unterstützt die Generierung mehrerer Bedingungen. Die Bedingungsfusion wird während des Trainings erlernt. Es müssen keine Hyperparameter oder Design-Eingabeaufforderungen festgelegt werden.
Kompatibel mit anderen Open-Source-SDXL-Modellen wie BluePencilXL, CounterfeitXL. Kompatibel mit anderen Lora-Modellen.
https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0
https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0
https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0
https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0
[07.06.2024] Veröffentlichung ControlNet++
und vorab trainierten Modellen.
[07.06.2024] Inferenzcode veröffentlichen (Einzelbedingung und Mehrfachbedingung).
[13.07.2024] Veröffentlichung ProMax ControlNet++
mit erweiterter Bearbeitungsfunktion.
ControlNet++ für Gradio
ControlNet++ für Comfyui
Geben Sie den Schulungscode und die Schulungsanleitung frei.
Arxiv-Papier freigeben.
Als eines der wichtigsten Controlnet-Modelle verwenden wir viele Tricks beim Training dieses Modells, genauso gut wie https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0, SOTA-Leistung bei der Posensteuerung. Damit das Openpose-Modell seine beste Leistung erreicht, sollten Sie die Funktion „draw_pose“ im Paket „controlnet_aux“ ersetzen (comfyui verfügt über ein eigenes Paket „controlnet_aux“). Weitere Informationen finden Sie in den Inferenzskripten .
Eines der wichtigsten Controlnet-Modelle, Canny, ist ein gemischtes Training mit Lineart, Anime Lineart, MSD. Robuste Leistung im Umgang mit allen dünnen Linien. Das Modell ist der Schlüssel zur Verringerung der Deformitätsrate. Es wird empfohlen, dünne Linien zum Nachzeichnen der Hand/des Fußes zu verwenden.
Als eines der wichtigsten Controlnet-Modelle kann das Scribble-Modell jede Linienbreite und jeden Linientyp unterstützen. genauso gut wie https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0, machen Sie jeden zum Seelenmaler.
Hinweis: Verwenden Sie das Posenskelett, um die menschliche Pose zu steuern. Verwenden Sie eine dünne Linie, um die Hand-/Fußdetails zu zeichnen, um Deformationen zu vermeiden
Hinweis: Das Tiefenbild enthält Detailinformationen. Es wird empfohlen, die Tiefe für den Hintergrund und das Posenskelett für den Vordergrund zu verwenden
Hinweis: Scribble ist ein starkes Linienmodell. Wenn Sie etwas ohne strenge Umrisse zeichnen möchten, können Sie es verwenden. Openpose + Scribble gibt Ihnen mehr Freiheit beim Erstellen Ihres ersten Bildes, dann können Sie die Details mit einer dünnen Linie bearbeiten.
Wir sammeln eine große Menge hochwertiger Bilder. Die Bilder werden sorgfältig gefiltert und mit Anmerkungen versehen. Die Bilder decken ein breites Themenspektrum ab, darunter Fotografie, Anime, Natur, MidJourney und so weiter.
Wir schlagen zwei neue Module in ControlNet++ vor, die jeweils „Condition Transformer“ und „Control Encoder“ heißen. Wir haben ein altes Modul leicht modifiziert, um seine Darstellungsfähigkeit zu verbessern. Darüber hinaus schlagen wir eine einheitliche Trainingsstrategie vor, um Einzel- und Mehrfachsteuerung in einer Phase zu realisieren.
Für jede Bedingung weisen wir ihr eine Steuertyp-ID zu, zum Beispiel openpose--(1, 0, 0, 0, 0, 0), Depth--(0, 1, 0, 0, 0, 0), Mehrere Bedingungen lauten wie (offene Position, Tiefe) - (1, 1, 0, 0, 0, 0). Im Steuerungs-Encoder wird die Steuerungstyp-ID in Steuerungstyp-Einbettungen konvertiert (unter Verwendung sinusförmiger Positionseinbettungen). Anschließend verwenden wir eine einzelne lineare Ebene, um die Steuerungstyp-Einbettungen so zu projizieren, dass sie mit der zeitlichen Einbettung die gleiche Helligkeit aufweisen. Die Steuerungstypfunktionen werden zur Zeiteinbettung hinzugefügt, um verschiedene Steuerungstypen anzuzeigen. Diese einfache Einstellung kann dem ControlNet dabei helfen, verschiedene Steuerungstypen zu unterscheiden, da die Zeiteinbettung tendenziell globale Auswirkungen auf das gesamte Netzwerk hat. Unabhängig davon, ob eine Einzelbedingung oder eine Mehrfachbedingung vorliegt, gibt es eine eindeutige Steuertyp-ID, die ihr entspricht.
Wir erweitern das ControlNet, um mehrere Steuereingänge gleichzeitig über dasselbe Netzwerk zu unterstützen. Der Zustandstransformator dient der Kombination unterschiedlicher Bildzustandsmerkmale. Bei unseren Methoden gibt es zwei wesentliche Neuerungen: Erstens teilen sich unterschiedliche Bedingungen denselben Bedingungsencoder, was das Netzwerk einfacher und leichter macht. Dies ist bei anderen Mainstream-Methoden wie T2I oder UniControlNet anders. Zweitens fügen wir eine Transformatorebene hinzu, um die Informationen des Originalbilds und der Zustandsbilder auszutauschen. Anstatt die Ausgabe des Transformators direkt zu verwenden, verwenden wir sie, um eine Bedingungsverzerrung gegenüber dem Originalzustandsmerkmal vorherzusagen. Dies ähnelt in gewisser Weise ResNet, und wir haben experimentell herausgefunden, dass diese Einstellung die Leistung des Netzwerks offensichtlich verbessern kann.
Der ursprüngliche Bedingungsencoder von ControlNet ist ein Stapel aus Conv-Layer- und Silu-Aktivierungen. Wir ändern die Encoder-Architektur nicht, wir erhöhen lediglich die Conv-Kanäle, um einen „fetten“ Encoder zu erhalten. Dies kann die Leistung des Netzwerks offensichtlich steigern. Der Grund dafür ist, dass wir für alle Bildbedingungen denselben Encoder verwenden, sodass der Encoder über eine höhere Darstellungsfähigkeit verfügen muss. Die ursprüngliche Einstellung ist für Einzelbedingungen gut, für mehr als 10 Bedingungen jedoch nicht so gut. Beachten Sie, dass die Verwendung der ursprünglichen Einstellung ebenfalls in Ordnung ist, allerdings mit einigen Einbußen bei der Qualität der Bilderzeugung.
Das Training mit einer einzigen Bedingung kann durch die Datenvielfalt eingeschränkt sein. Openpose erfordert beispielsweise das Training mit Bildern mit Personen und mlsd erfordert das Training mit Bildern mit Linien, was sich möglicherweise auf die Leistung beim Generieren unsichtbarer Objekte auswirkt. Außerdem ist die Schwierigkeit, verschiedene Bedingungen zu trainieren, unterschiedlich. Es ist schwierig, alle Bedingungen gleichzeitig in Einklang zu bringen und bei jeder einzelnen Bedingung die beste Leistung zu erzielen. Schließlich neigen wir dazu, zwei oder mehr Bedingungen gleichzeitig zu verwenden. Durch das Training mit mehreren Bedingungen wird die Fusion verschiedener Bedingungen reibungsloser und die Robustheit des Netzwerks erhöht (da einzelne Bedingungen nur begrenztes Wissen erlernen). Wir schlagen eine einheitliche Trainingsphase vor, um die optimale Konvergenz einzelner Bedingungen und die Fusion mehrerer Bedingungen gleichzeitig zu realisieren.
ControlNet++ erfordert die Übergabe einer Steuertyp-ID an das Netzwerk. Wir führen die 10+ Steuerung zu 6 Steuerungstypen zusammen, die Bedeutung jedes Typs ist wie folgt:
0 – offene Position
1 – Tiefe
2 – dicke Linie (scribble/hed/softedge/ted-512)
3 – dünne Linie (canny/mlsd/lineart/animelineart/ted-1280)
4 – normal
5 – Segment
Wir empfehlen eine Python-Version >= 3.8, Sie können die virtuelle Umgebung mit dem folgenden Befehl festlegen:
conda create -n controlplus python=3.8 Conda aktiviert ControlPlus pip install -r Anforderungen.txt
Sie laden das Modellgewicht unter https://huggingface.co/xinsir/controlnet-union-sdxl-1.0 herunter. Jede neue Modellveröffentlichung wird auf dem Huggingface veröffentlicht. Sie können https://huggingface.co/xinsir folgen, um die neuesten Modellinformationen zu erhalten.
Wir stellen für jede Kontrollbedingung ein Inferenzskript zur Verfügung. Weitere Einzelheiten finden Sie hier.
Es gibt einige Vorverarbeitungsunterschiede. Um die beste Openpose-Control-Leistung zu erzielen, gehen Sie bitte wie folgt vor: Suchen Sie util.py im Paket controlnet_aux und ersetzen Sie die Funktion draw_bodypose durch den folgenden Code
def draw_bodypose(canvas: np.ndarray, keypoints: List[Keypoint]) -> np.ndarray: """ Zeichnen Sie Schlüsselpunkte und Gliedmaßen, die die Körperhaltung auf einer bestimmten Leinwand darstellen. Argumente: Canvas (np.ndarray): Ein 3D-Numpy-Array stellt die Leinwand (Bild) dar, auf der die Körper-Schlüsselpunkte gezeichnet werden sollen (List[Schlüsselpunkt]): Eine Liste von Schlüsselpunkt-Objekten, die die Körper-Schlüsselpunkte darstellen Gezeichnet. Gibt zurück: np.ndarray: Ein 3D-Numpy-Array, das die geänderte Leinwand mit der gezeichneten Körperpose darstellt. Hinweis: Die Funktion erwartet, dass die x- und y-Koordinaten der Schlüsselpunkte zwischen 0 und 1 normalisiert sind. C = Canvas.Form wenn max(W, H) < 500: Verhältnis = 1,0 elif max(W, H) >= 500 und max(W, H) < 1000: Verhältnis = 2,0 elif max(W, H) >= 1000 und max(W , H) < 2000: Verhältnis = 3,0 elif max(W, H) >= 2000 und max(W, H) < 3000: Verhältnis = 4,0 elif max(B, H) >= 3000 und max(B, H) < 4000: Verhältnis = 5,0 elif max(B, H) >= 4000 und max(B, H) < 5000: Verhältnis = 6,0 sonst: Verhältnis = 7,0 Stickwidth = 4 limbSeq = [ [2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], [15, 17], [1, 16], [16, 18], ] Farben = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0 ], [0, 255, 0], [0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85 , 0, 255], [170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]] für (k1_index, k2_index), Farbe in zip(limbSeq, Farben): keypoint1 = keypoints[k1_index - 1] keypoint2 = keypoints[k2_index - 1], wenn keypoint1 ist Keine oder Schlüsselpunkt2 ist Keine: Weiter Y = np.array([Schlüsselpunkt1.x, Schlüsselpunkt2.x]) * float(W) X = np.array([Schlüsselpunkt1.y, Schlüsselpunkt2.y]) * Float(H) mX = np.mean(X) mY = np.mean(Y) Länge = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0,5 Winkel = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) Polygon = cv2.ellipse2Poly(( int(mY), int(mX)), (int(length / 2), int(stickwidth * ratio)), int(angle), 0, 360, 1) cv2.fillConvexPoly(canvas, polygon, [int(float(c) * 0.6) for c in color]) für Schlüsselpunkt, Farbe in zip(Schlüsselpunkte, Farben): wenn Schlüsselpunkt None ist: weiter x, y = keypoint.x, keypoint.y x = int(x * W) y = int(y * H) cv2.circle(canvas, (int(x), int(y)), int(4 * ratio), Farbe, Dicke = -1) Leinwand zurückgeben
Für die Schlussfolgerung einer einzelnen Bedingung sollten Sie eine Eingabeaufforderung und ein Kontrollbild angeben und die entsprechenden Zeilen in der Python-Datei ändern.
Python controlnet_union_test_openpose.py
Für die Inferenz mit mehreren Bedingungen sollten Sie sicherstellen, dass Ihre Eingabe-Bildliste mit Ihrem Steuertyp kompatibel ist. Wenn Sie beispielsweise Openpose und Tiefensteuerung verwenden möchten, gilt Bildliste --> [controlnet_img_pose, controlnet_img_ Depth, 0, 0, 0, 0], Steuertyp -- > [1, 1, 0, 0, 0, 0]. Weitere Einzelheiten finden Sie in controlnet_union_test_multi_control.py.
Theoretisch müssen Sie die Bedingungsskala nicht für verschiedene Bedingungen festlegen. Das Netzwerk ist so konzipiert und trainiert, dass verschiedene Bedingungen auf natürliche Weise zusammengeführt werden. Die Standardeinstellung ist 1,0 für jede Bedingungseingabe und gilt auch für das Training mit mehreren Bedingungen. Wenn Sie jedoch die Auswirkung auf eine bestimmte Eingabebedingung erhöhen möchten, können Sie die Bedingungsskalen im Condition Transformer-Modul anpassen. In diesem Modul werden die Eingabebedingungen zusammen mit der Bias-Vorhersage zu den Quellbildmerkmalen hinzugefügt. Das Multiplizieren mit einer bestimmten Skala hat große Auswirkungen (kann jedoch zu einem unbekannten Ergebnis führen).
Python controlnet_union_test_multi_control.py