Anifusion-SD

Dec 23 2022
TL;DR Dies ist ein neues Stable-Diffusion-ähnliches Modell (verfeinert von SD2) für Anime-Bilder, das eine Auflösung von 768 x 768 unterstützt und laut unseren Bewertungen einige beliebte Anime-Modelle deutlich übertrifft. Checkpoints sind öffentlich (Installationsanleitung), Demo seit einiger Zeit verfügbar.

TL;DR

Dies ist ein neues Stable-Diffusion-ähnliches Modell (verfeinert von SD2) für Anime-Bilder, das eine Auflösung von 768 x 768 unterstützt und laut unseren Bewertungen einige beliebte Anime-Modelle deutlich übertrifft. Checkpoints sind öffentlich ( Installationsanleitung ), Demo ist seit einiger Zeit verfügbar.

  • Einleitung
  • Hintergrund
    - Diffusionsmodelle
    - Latente Diffusion
    - Stabile Diffusion
    - Waifu-Diffusion
    - Stabile Diffusion 2
  • Unser Modell: Training
    - Conditioner
    - Technische Probleme und Optimierungen
    - Aktualisierung des Trainingssatzes
    - Training mit höherer Auflösung
    - Sampling-Änderungen
  • Ergebnisse
  • Vergleich mit anderen Anime-Modellen
  • Diskussion
  • Verweise
  • Zeiger

Nach meinen Experimenten mit dem Training von Diffusionsmodellen von Grund auf wurde von mehreren Personen darauf hingewiesen, dass es eine Reihe fein abgestimmter Stable Diffusion - Versionen auf denselben/ähnlichen Datensätzen gibt. Im Speziellen:

  • Waifu Diffusion : Es verwendet eine relativ kleine Teilmenge der Daten und speist nur die Tag-Eingabeaufforderung in CLIP zur Konditionierung ein), ohne Codeänderungen an der ursprünglichen Stable Diffusion (dies ist meiner Meinung nach problematisch). Trotzdem scheint es derzeit das beliebteste Anime-Diffusionsmodell zu sein. Im Gegensatz zum nächsten Modell wurde der Kontrollpunkt für die Öffentlichkeit freigegeben.
  • NovelAI : Dies wird von einem echten Unternehmen durchgeführt, nicht von unabhängigen Forschern/Ingenieuren. Sie geben das Modell nicht frei, sondern stellen ihm eine kostenpflichtige Schnittstelle zur Verfügung. Anscheinend gab es auch ein Drama, als ihr Kontrollpunkt und ihr Code durchgesickert waren, von dem es scheint, dass sie einige kleine Modifikationen an der ursprünglichen Stable Diffusion hatten;
  • Anything-v3 : Dieser erschien etwas später, es gibt nicht viele Informationen über das Modell, aber es wird vermutet, dass es von WaifuDiffusion fein abgestimmt wurde (zumindest verwendet es ähnliche Eingabeaufforderungstransformationen, bevor es CLIP zugeführt wird). Es erzeugt sehr detaillierte und gut aussehende Bilder, ist aber der Eingabeaufforderung nicht sehr treu. Sein Ausgaberaum ist sehr klein (mangelnde Vielfalt, alle Bilder haben den gleichen Stil und sind einander ähnlich) und erinnert an GAN-Modelle vor der Diffusion. Im Gegensatz zu den anderen Modellen ist dieses Modell auch nicht in der Lage, NSFW zu erzeugen – also wurde es vielleicht durch die Feinabstimmung eines kleinen Datensatzes hochwertiger Bilder von einem einzelnen Künstler erhalten.

Angesichts der Fülle an Modellen in diesem Bereich entschied ich mich jedoch zunächst, mich nicht weiter einzubringen und dem Fortschritt seinen Lauf zu lassen. Aber jetzt wurde Stable Diffusion 2 veröffentlicht, und es gibt immer noch keine sichtbaren Fortschritte bei Anime-Modellen. Also beschloss ich, es auszuprobieren – in diesem Beitrag beschreibe ich, wie ich Stable Diffusion 2 mit einem benutzerdefinierten Prompt Conditioner feinabgestimmt habe, und zeige die Ergebnisse. Natürlich veröffentliche ich auch das Modell – von den wenigen Eingabeaufforderungen, die ich ausprobiert habe, war es besser als die oben aufgeführten Modelle. Die nächsten Abschnitte konzentrieren sich auf die technischen Details, wenn Sie nicht interessiert sind, können Sie direkt zu den Ergebnissen springen .

Hintergrund

Um zu verstehen, was passiert und was sich geändert hat, geben wir zunächst einen kurzen Überblick über die bestehenden Modelle.

Diffusionsmodelle

Auf Diffusionsmodelle gehe ich nicht näher ein, es gibt bereits viele gute Reviews darüber im Internet. Für unsere Zwecke reicht es zu wissen, dass die Idee darin besteht, den Prozess der Bilderzeugung in eine Abfolge von „Denoising“-Schritten zu zerlegen. Während des Trainings wird das Modell-Backbone (im Falle von Bildern – normalerweise eine UNet) erhält ein beschädigtes Image und den Denoising-Schritt und versucht, einen einzelnen Korruptionsschritt rückgängig zu machen. Während der Inferenz beginnen wir mit einem zufälligen Rauschen und wenden das Rückgrat wiederholt an, um alle imaginären Korruptionsschritte „rückgängig zu machen“. Die genaue Mathematik dahinter muss präzise sein. Zum Zeitpunkt der Inferenz modifizieren die meisten modernen Diffusionsmodelle den Prozess, um die Anzahl der Abtastschritte zu reduzieren (dies wurde ermöglicht, indem jemand bemerkte, dass der Prozess dem Lösen einer stochastischen Differentialgleichung mit einer numerischen Methode verdächtig ähnlich ist, und einen intelligenteren DE-Löser anwendete stattdessen).

Latente Diffusion

Dies ist wohl die wichtigste Idee, die in den meisten Open-Diffusion-Modellen verwendet wird. Unternehmen wie Google oder OpenAI können es sich leisten, Diffusionsmodelle im ursprünglichen Pixelraum zu trainieren und zu verwenden, da sie über viel Hardware verfügen. Aber für einen Laien ist das Training (oder sogar das Ausführen) von UNet in einem 512x512-Pixel-Raum sehr teuer. Die Idee ist, den Autoencoder zu trainieren, der das Bild aus dem ursprünglichen 512x512x3-Raum in einen latenten Raum komprimiert (im Falle von Stable Diffusion — 64x64x4). Der Autoencoder wird als VAE mit KL-basierter Regularisierung trainiert, um den latenten Raum „schön“ zu halten.

Dann führt das Modell die Diffusion in diesem 64x64x4-Raum durch, was offensichtlich viel effizienter ist. Der Nachteil ist, dass die VAE nicht perfekt ist und einige Informationen beim Komprimieren des Bildes verloren gehen. Aber in der Praxis funktioniert es sehr gut.

FWIW, alternative Ansätze sind möglich, z. B. erzeugt Imagen ein niedrigdimensionales Bild im Pixelraum und skaliert es dann schrittweise hoch. Dies ist jedoch für das Modell, das wir in diesem Artikel beschreiben, nicht relevant.

Stabile Diffusion

Dies war eher ein sozialer als ein technischer Durchbruch. Das Modell war ein „Vanille“-Modell der latenten Diffusion, das auf LAION trainiert wurde , und im Gegensatz zu den meisten vorherigen Bilderzeugungsmodellen wurde es der Öffentlichkeit zugänglich gemacht. Dadurch wurde die Technologie einem breiten Publikum zugänglich gemacht, das mit maschinellem Lernen nicht vertraut ist, was zu viel Kreativität, Diskussionen und Menschen führte, die sie an verschiedenen Datensätzen (z. B. den oben erwähnten Anime-Modellen) verfeinerten.

Eine interessante Wahl in der Architektur, die für uns sehr relevant ist, ist die Konditionierung des Modells. Normalerweise werden Modelle sowohl im „bedingungslosen“ ( UNet(corrupted image) ~ image ) als auch im bedingten ( UNet(corrupted image, condition) ~ image ) Modus trainiert, und beim Sampling wird eine klassifikatorfreie Anleitung verwendet: Anstelle von UNet ( beschädigtes Bild , Bedingung ) beim Generieren von Bildern verwendet es C * UNet ( beschädigtes Bild, Bedingung ) - ( C - 1) * UNet ( beschädigtes Bild ) und Cist deutlich größer als 1 (z. B. 7). Dies ist nicht sehr intuitiv, verbessert jedoch erheblich sowohl die Bildqualität als auch die Genauigkeit der erzeugten Bilder.

Für uns relevant ist, wie der Zustand erreicht wird. In Stable Diffusion verwenden sie die letzte verborgene Ebene des Textcodierers des CLIP -Modells. Es ist eingefroren, dh es werden während des Trainings keine Gradienten zurückpropagiert. Es kann als Sprachcodierermodell betrachtet werden, wobei einige sekundäre Bildvarianten das Sprachverständnis in Richtung visuelles Verständnis beeinflussen.

Waifu-Diffusion

Dies ist eine Stable Diffusion, die auf Anime-Bilder abgestimmt ist. Es scheint, dass sie eine Teilmenge von Danbooru2021 (oder etwas Ähnliches) als Trainingssatz verwendet haben. Sie verwendeten Stable Diffusion so, wie es ist, ohne Änderungen am Code (sie haben jedoch den Decoder-Teil von VAE verfeinert, damit er mit Anime-Bildern etwas besser funktioniert).

Infolgedessen verwenden sie auf ähnliche Weise CLIP als Konditionierer und füttern ihn mit einer Zeichenfolge mit Tags als Eingabeaufforderung. Ich vermute, es hat ziemlich schlecht funktioniert, da sie auch Tags vorverarbeiten (z. B. Unterstriche durch Leerzeichen ersetzen). Aber selbst damit scheint das CLIP-Verständnis der Eingabeaufforderung suboptimal zu sein.

Stabile Diffusion 2

Dies ist eine inkrementelle Version, die das Modell (der gleichen Größe) von Grund auf neu trainiert und auch den Conditioner durch OpenCLIP ersetzt hat . Es hat auch einige interessante zusätzliche Funktionen, wie tiefenbasiertes img2img und ein Modell mit höherer Auflösung (768 x 768 Pixel).

Unser Modell: Ausbildung

Das Ziel ist die Feinabstimmung von Stable Diffusion 2 für die Anime-Bilder, wobei der Encoder durch ein benutzerdefiniertes Modell ersetzt wird, das auf den Satz von Tags als Eingabe spezialisiert ist, im Gegensatz zur natürlichen Sprache des CLIP. Neben einer besseren Konditionierung würde dies auch die sofortige Augmentationstechnik von Anifusion ermöglichen , die der Qualität und Vielfalt dort so sehr zugute kam.

Conditioner

Wir verwenden den gleichen Ansatz wie in Anifusion: Das Konditionierungsmodell ist ein Transformator in BERT- Größe ohne Positionseinbettungen (um die Symmetrie von Tag-Eingabeaufforderungen zu erfassen: Die Reihenfolge der Tags sollte keine Rolle spielen). Wir ersetzen nur den Conditioner, wobei der Queraufmerksamkeitsteil des Diffusionsrückgrats gleich bleibt.

Eine wichtige Frage hier ist, wie man den Gewichtungstransformator initialisiert. Ausgehend vom ungeschulten Konditionierer und trainiertem UNet und gemeinsames Training kann dazu führen, dass der Trainingsprozess die UNet-Gewichte zerstört oder erheblich verschlechtert. Glücklicherweise ist es nicht schwer, dies zu beheben: Wir können das UNet einfrieren und das Training für einige Zeit nur für den Transformatorteil ausführen.

Technische Probleme und Optimierungen

Um das Training effizient zu gestalten, ist es wichtig, eine möglichst hohe Stapelgröße in den Video-RAM zu quetschen (z. B. weil die Kosten für die Anwendung der Optimierungslogik nur einmal pro Stapel bezahlt werden). Hier gibt es grundsätzlich zwei Richtungen.

Pipeline-Änderungen

Der kanonische SD-Trainingscode führt den VAE-Encoder online aus, analysiert das Rohbild und codiert es. Dies ist die am wenigsten hängende Frucht, die es zu beseitigen gilt: VAE-Gewichte verbrauchen VRAM, Zwischenvariablen aus der Anwendung dieses Encoders verbrauchen ebenfalls VRAM, der Prozess des Codierens braucht Zeit. Insbesondere wenn wir die Daten mehrfach durchlaufen, macht es keinen Sinn, die Kosten für die mehrfache Codierung desselben Bildes zu zahlen.

Glücklicherweise ist dieser Teil einfach zu optimieren: Wir codieren einfach alle Bilder im Trainingssatz vor. Ein zusätzlicher Vorteil besteht darin, dass der resultierende Trainingssatz viel kleiner ist (in Bezug auf die Festplattengröße) als die ursprünglichen 512 x 512-Bilder im Pixelraum.

Eine andere Möglichkeit, etwas VRAM zu sparen, besteht darin, EMA zu deaktivieren. Exponentieller gleitender Durchschnitt ist ein Trick, um die Qualität des Modells leicht zu verbessern, indem Gewichte aus einer Reihe von letzten Prüfpunkten (grob) gemittelt werden, und das Nichtspeichern von EMA ist eine einfache Möglichkeit, weniger VRAM zu verwenden, ohne das resultierende Modell stark zu beeinträchtigen.

Trainingsänderungen

Eine beliebte Möglichkeit, das Training zu beschleunigen und VRAM zu sparen, ist die Verwendung einer geringeren Genauigkeit: Verwenden Sie anstelle der üblichen fp32 (32-Bit-Gleitkommazahlen) fp16 oder bf16 (Variationen von 16-Bit-Gleitkommazahlen) oder gemischte Genauigkeit (perform einige Operationen in fp16).

Ich habe es versucht, und es hilft tatsächlich der Leistung, aber es ist viel zu gefährlich. Insbesondere habe ich an einer Stelle „with Torch.autocast():“ (gemischte Genauigkeit) zur Aufmerksamkeit hinzugefügt und dann ziemlich viel Zeit damit verschwendet, herauszufinden, warum das Modell im Laufe der Zeit langsam divergiert.

Infolgedessen entschied ich, dass es sicherer ist, Optimierungen dieser Art nicht auf das Modell anzuwenden, da das Training bereits recht effizient war.

Aktualisierung des Trainingssets

In Anifusion wurde eine ältere Version des Danbooru- Datensatzes verwendet, daher entschied ich, dass es ein guter Zeitpunkt ist, ihn zu aktualisieren und gleichzeitig die Größe des Trainingssatzes und des Satzes unterstützter Tags in der Eingabeaufforderung zu erweitern. Es gab jedoch ein paar Komplikationen: (1) Die neue Version des Datensatzes war keine einfache Obermenge des vorherigen, und (2) ich entschied mich dafür, dies zu tun, während das Modell bereits trainierte, also einige zusätzliche Arbeit, um den bestehenden zu überführen Checkpoint war notwendig.

Datensatzunterschiede

Das ist etwas unbedeutend, aber nachdem ich Metadaten für die neue Datensatzversion heruntergeladen hatte, bemerkte ich, dass ein paar Bilder (ein paar Prozent) verschwunden waren. Einige Tags, die es zuvor in die Top-2,5k geschafft hatten, verschwanden ebenfalls (einschließlich einiger der beliebtesten), außerdem stimmten die entfernten Bilder mit den entfernten Tags überein.

Eine weitere Untersuchung ergab, dass die verschwundenen Tags alle mit dem „ausgefransten NSFW“-Muster übereinstimmten (einige von ihnen waren so ausgefranst, dass ich nicht einmal wusste, dass es solche Dinge gibt …). Es war irgendwie inkonsistent, da andere ähnliche Tags und Bilder beibehalten wurden. Ich vermute, dass entweder der Betreuer des Datensatzes oder die Quellbild-Hosting-Site es als schnellen Hack implementiert haben, um einige PR-Bedenken auszuräumen. Wie auch immer, ich habe gerade die Vereinigung von alten und neuen Datensätzen genommen und ungefähr 2 Millionen Bilder zum Trainieren bekommen. Außerdem habe ich daraus 800.000 Bilder mit einer Auflösung ≥ 786x768 gesampelt, um das Modell mit höherer Auflösung später zu optimieren.

Erweiterung des Tag-Sets

Dieser Abschnitt ist eigentlich nicht trivial. Zum Zeitpunkt der Erstellung des neuen Datensatzes wurde das Modell eine ganze Weile trainiert, da es einen gut konvergierten Conditioner-Transformator hatte und Eingabeaufforderungen von den Top-2,5k-Tags als Eingaben nahm. Für die neuere Version habe ich mich entschieden, stattdessen die Top-12k-Tags zu nehmen. Wie füge ich sie dem Modell hinzu?

Was aktualisiert werden muss, ist die Einbettungstabelle des Transformators (von 2500x1024 auf 12000x1024). Ein naiver Ansatz besteht darin, die neuen Einbettungen zufällig zu initialisieren und das Modell für einige Zeit mit dem eingefrorenen UNet zu trainieren, wobei nur der Transformator aktualisiert wird. Aber das ist (1) Zeit- und Rechenverschwendung, (2) langweilig. Können wir sie besser initialisieren?

Sehen wir uns an, welche Informationen uns zur Verfügung stehen. Wir haben bereits 2,5 000 Einbettungen trainiert, und die Einbettungen für die neuen Tags sollten ihnen etwas ähnlich sein. Aber zu welchen? Eine naive Idee ist es, die Einbettungen semantisch ähnlicher Tags zu verwenden. Aber wie erhalten wir semantische Ähnlichkeit? Das gute alte word2vec ist darin sehr gut, also können wir einfach die Tag-Sets nehmen und word2vec-Einbettungen darauf trainieren. Unten ist eine t-SNE- Visualisierung des Ergebnisses (dunkle Punkte entsprechen NSFW-Tags, sodass sie für Personen, die sie nicht ansehen möchten, leicht übersprungen werden können): interaktiver Link .

Betrachten wir dieselbe Visualisierung für die 2,5 000 trainierten Einbettungen aus dem Transformator: interaktiver Link .

Es ist also nicht wirklich dasselbe und konzentriert sich mehr auf das visuelle Erscheinungsbild als auf die Semantik. Es sollte jedoch nah genug sein, damit wir die anfänglichen Einbettungen für die neuen Tags wie folgt berechnen können: Nehmen Sie die nächsten Nachbarn im word2vec-Raum von den Top-2,5k und aggregieren Sie ihre Transformer-Einbettungen. Tatsächlich können wir es sogar ein wenig verbessern: Trainieren Sie ein kleines NN, das word2vec so umwandelt, dass die Aggregation des nächsten Nachbarn mit der wahren Einbettung der ersten 2,5 000 übereinstimmt, und wenden Sie es auf die restlichen Tags an.

Damit erhalten wir eine vernünftige Initialisierung für die neuen Einbettungen, modifizieren den letzten Prüfpunkt und setzen das Training mit den neuen Daten unverändert fort.

Höher aufgelöstes Training

Stable Diffusion 2 hat eine Version davon, die Bilder der Größe 768 x 768 (dh 2,25-mal größer als 512 x 512) erzeugt, was einige interessante Eigenschaften hat (z. B. scheint es besser mit dem Ziehen von Fingern umzugehen als die Version mit niedrigerer Auflösung). Also haben wir uns entschieden, dasselbe mit unserem Modell zu tun. Insbesondere haben wir zwei Stufen der Ausbildung:

  • Niedrige Auflösung: Training auf 512 x 512 Bildern (64 x 64 x 4 Latentraum), mit Stapelgröße 11, Lernrate 5e-6, für 1 Million Schritte;
  • Hochauflösend: Fortsetzung der vorherigen Phase, Training mit 768 x 768 Bildern (96 x 96 x 4 latenter Raum), mit Stapelgröße 5, Lernrate 5e-6, 80.000 Schritte.

Sampling-Änderungen

In Anifusion verbesserte die Erweiterung der Eingabeaufforderung mit einem separaten Modell die Ergebnisse drastisch. Intuitiv ist es einfacher, Dinge im diskreten Konzeptraum zu sampeln als im impliziten kontinuierlichen Raum innerhalb des Diffusionsprozesses.

Hier wenden wir die gleiche Technik an und trainieren den Prompt Augmentation Transformer auf dem neuen Trainingsset neu. Wir beobachten den gleichen Effekt – die Probenqualität und -vielfalt nimmt mit der Prompt-Augmentation drastisch zu, insbesondere bei kurzen Prompts.

Ergebnisse

Es scheint, dass das 768x768-Modell bessere Bilder erzeugt als das 512x512-Modell, und das nicht nur wegen der Auflösung: Die Gesamtkonsistenz der Bilder und (insbesondere) anatomische Details der Charaktere sind besser. Es scheint jedoch, dass die prompte Treue etwas schlechter ist (ich habe jedoch keine richtigen Messungen, nur meinen Eindruck).

Eine Sache, die zu beachten ist, ist, dass das Modell im Vergleich zu Anifusion stärker auf NSFW-/rassige Bilder ausgerichtet zu sein scheint. Einiges davon kann auf die prompte Erweiterung zurückgeführt werden, aber auch der UNet-Teil ist dafür verantwortlich. Ich bin mir nicht sicher, warum es passiert (Änderungen des Trainingssatzes waren eher gering; vielleicht verursacht dies die Größe / das Starten von Stable Diffusion?).

Lassen Sie uns Schritt für Schritt verschiedene Arten von Bildern durchgehen.

Porträts

Dies ist der einfachste Anwendungsfall, und Anime-Porträts wurden sogar in der GAN-Ära erfolgreich erstellt. Es überrascht also nicht, dass das Modell damit keine Probleme hat (einige Beispiele unten).

Einzelnes Zeichen, beliebte Tags

Dies ist ein härterer Test, und wie erwartet kann es von Zeit zu Zeit (selten) zu schlechten Bildern kommen. Eine häufige Fehlerursache ist eine schlechte Anatomie – ein zusätzlicher Arm oder ein zusätzliches Bein. Und natürlich sind Finger eine ziemliche Herausforderung für das Model.

Einzelzeichen, Tail-Tags

Hier testen wir weniger beliebte Tags, insbesondere diejenigen, die in späteren Trainingsphasen hinzugefügt wurden (siehe oben für weitere Details). Sie scheinen ganz gut zu funktionieren, wenn auch nicht perfekt. Einige Beispiele sind unten. Im Allgemeinen scheint es, dass Zeichen-Tags einfacher für das Modell sind als Konzept-Tags.

Neu hinzugefügte Tags, von links nach rechts: „Lion“ (unklar, vielleicht reitet sie darauf), „facepalm“ (funktionierte nicht), „venti_(genshin_impact)“ (funktionierte)

Charakterinteraktionen

Endlich kommen wir zu etwas Interessantem. Original Anifusion lief nicht gut, wenn Charaktere interagierten. Ist das neue Modell besser?

Mehrere Zeichen, die nur nebeneinander stehen, scheinen in Ordnung zu sein:

Einfache Aktionen funktionieren auch etwas:

Von links nach rechts: „kuss“, „händchen halten“, „umarmen“

Auch Interaktionen mit Objekten sind mehr oder weniger fein:

Von links nach rechts: „holding_gun“, „riding“, „holding_food“

Wenn wir jedoch versuchen, komplizierte Interaktionen zu spezifizieren, erzeugt dies meistens Körperhorror (ich werde diese Bilder hier nicht posten, da sie verstörend sein können). Warum passiert dies? Ich spekuliere, dass dies daran liegt, dass die Eingabeaufforderungen nur Sätze von Tags sind und die Interaktionen nicht genau genug spezifizieren. Was dazu führte, dass Diffusionsmodelle in erster Linie gute Bilder produzierten, war die klassifikatorfreie Führung: Die Überbetonung von Prompts verbesserte die Qualität drastisch im Vergleich zum promptless Sampling, da das Sampling komplizierter Konzepte innerhalb der Diffusion schwierig ist. Wir können also erwarten, dass alles, was eindeutig in der Eingabeaufforderung angegeben ist, gut generiert wird, aber Mehrdeutigkeiten werden auf nicht so schöne Weise gelöst. Die Eingabeaufforderung in natürlicher Sprache kann in diesem Sinne besser sein.

FWIW, in Kommentaren zum ursprünglichen Anifusion-Beitrag auf reddit schlug Gwern vor, BLIP zu verwenden, um Eingabeaufforderungen in natürlicher Sprache aus den Bildern zu generieren; Ich habe es tatsächlich versucht, und die Qualität der Eingabeaufforderungen war extrem niedrig, also ist es nicht so einfach.

Stile

In der ursprünglichen Stable Diffusion fanden die Leute zahlreiche Möglichkeiten, dem Modell Stile zuzuweisen, hauptsächlich durch Hinzufügen von Namen einiger Künstler. Funktioniert das gleiche für das Anime-Modell?

Probieren Sie es aus – es funktioniert sehr gut (das ist ein Vorteil gegenüber AnythingV3). Unten sind Beispiele in verschiedenen zufälligen Stilen.

Vergleich mit anderen Anime-Modellen

Wir führen keinen Vergleich mit AnythingV3 durch, da es die Eingabeaufforderung nicht wirklich respektiert und ähnliche Bilder für so ziemlich alles generiert (wie der Name schon sagt). Damit bleiben WaifuDiffusion und NovelAI übrig. Wir haben uns gegen den Vergleich mit NovelAI entschieden, da dies die Verwendung des durchgesickerten Kontrollpunkts erfordern würde, und es besser ist, sich von diesem Drama fernzuhalten. Damit bleibt uns WaifuDiffusion.

Eine Sache, die zu beachten ist, ist, dass ein Vergleich bei kurzen Eingabeaufforderungen gegenüber WaifuDiffusion zu unfair wäre: Es enthält keine Eingabeaufforderungserweiterung (im Gegensatz zu Anifusion), was zu sehr schlechten Ergebnissen bei kurzen Eingabeaufforderungen führt. Also führen wir stattdessen zwei verschiedene Vergleiche durch. In einem Fall nehmen wir Stichproben von Tag-Sets aus dem Original-Datensatz vor, entfernen die prompte Augmentation effektiv aus der Betrachtung und vergleichen nur den Diffusionsteil. Im zweiten konstruieren wir manuell einige mittelgroße Eingabeaufforderungen und evaluieren beide Modelle an ihnen (dies schließt die Auswirkung der Eingabeaufforderungserweiterung ein).

Tag-Sets aus dem Datensatz

Wir nehmen Stichproben von 97 Tag-Sets aus dem Datensatz (einheitliche Filterung nach „sicheren“ bewerteten Bildern). Für Anifusion verarbeiten wir sie vor, indem wir „rating_s, score_perc_100, adjusted_score_perc_100“ zur Eingabeaufforderung hinzufügen. Für WaifuDiffusion verarbeiten wir sie vor, indem wir Unterstriche durch Leerzeichen ersetzen. In beiden Fällen verwenden wir DDIM -Sampling mit 50 Schritten und klassifikatorfreier Orientierungsskala 9.

Nachdem wir einige menschliche Bewertungen erhalten haben (mit zufällig umgedrehten Seiten zum Vergleich), erhalten wir die folgenden Ergebnisse im Vergleich zu Waifu:

  • Anifusion ist besser: 30 %
  • Waifu ist besser: 24 %
  • Ungefähr gleich: 46 %

Ein Fehlermuster, das mir in Waifu aufgefallen ist: Es erzeugt oft ein Unterbild anstelle eines Vollbilds, wodurch der Kopf des Charakters abgeschnitten wird. Ein Fehlermuster von Anifusion ist eine unaufgeforderte NSFW (und damit verbundene schlechte Anatomie; aus irgendeinem Grund, je näher das Bild an NSFW ist, desto schlechter bekommt das Modell die Anatomie).

Nebenbemerkung: Hier finden Sie AnythingV3-Ergebnisse für dieselben Eingabeaufforderungen. Die Ergebnisse sehen gut aus, aber man kann sehen, warum ich zögere, sie in Vergleiche einzubeziehen: Alle Bilder scheinen in genau demselben Stil zu sein, es fehlt ihnen stark an Vielfalt, was bedeutet, dass das Modell einen viel kleineren Ausgaberaum hat.

Mit In-Distribution-Sampling ist es also nicht drastisch besser. Aber was, wenn wir die hochauflösende Version des Modells verwenden?

  • Anifusion ist besser: 41 %
  • Waifu ist besser: 13 %
  • Ungefähr gleich: 46 %

Man kann feststellen, dass es eine nicht triviale Menge von „ungefähr gleich“ gibt. Bei den meisten dieser Beispiele sind beide Modelle gleich gut, aber es gibt einige, bei denen beide Modelle schrecklich schlecht sind (irgendwie korrelieren sie darin).

Manuelle mittelgroße Eingabeaufforderungen

Wir verwenden dieselbe Eingabeaufforderungsvorverarbeitung wie im vorherigen Abschnitt beschrieben. Wir bereiten manuell 33 vernünftige Eingabeaufforderungen mittlerer Größe vor (da sie natürlich von einer einzelnen Person erstellt werden, sind sie möglicherweise nicht repräsentativ für die Gesamtverteilung).

Hier sind die Ergebnisse sehr unterschiedlich:

  • Anifusion ist besser: 73 %
  • Waifu ist besser: 9 %
  • Ungefähr gleich: 18 %

Wie wir sehen können, macht eine sofortige Augmentation einen Unterschied. Was passiert, wenn wir das hochauflösende Modell verwenden? Die Ergebnisse sind ziemlich ähnlich ( Rohdaten ):

  • Anifusion ist besser: 73 %
  • Waifu ist besser: 3 %
  • Ungefähr gleich: 24 %

Zugänglichkeit für Laien

Eine interessante Beobachtung ist, dass sich das Modell selbst nach einer Million Trainings-Minibatches weiter verbessert. Es ist unklar, ob sich das Modell nach so vielen Schritten an irgendetwas vom ursprünglichen Stable Diffusion-Checkpoint erinnert. Vielleicht ist der Anime-Datensatz einfach genug, dass man SD-große Diffusionsmodelle von Grund auf auf handelsüblicher Hardware trainieren kann, ohne den Hotstart von der vorhandenen SD? Dies ist eine Richtung, die es zu untersuchen gilt: Wenn dies der Fall ist, sollte das Ausprobieren neuer Architekturen für Einzelpersonen einfacher werden, ohne dass Millionen von Dollar für Rechenleistung ausgegeben werden müssen, wie dies bei LAION-basiertem Training der Fall ist.

Weitere Qualitätsverbesserungen

Es ist interessant zu sehen, wie weit es möglich ist, mit dem aktuellen Modell zu kommen, also möchte ich es etwas weiter verfeinern, möglicherweise unter Verwendung des vollständigen Datensatzes und nicht des 2M-Teilsatzes. Aber ich vermute, dass der begrenzende Faktor die Datensatzqualität ist, nicht der Umfang der Feinabstimmung (dh um die Modellqualität zu verbessern, müsste man entweder nur Bilder mit höherer Qualität einspeisen oder dem Conditioner eine spezielle Kennung hinzufügen, die dem Modell hilft um bessere von schlechteren Bildern zu unterscheiden). Meines Wissens gibt es keine zuverlässigen Modelle wie dieses für Anime (für allgemeine Bilder verwenden die Leute die Untergruppe „Ästhetik“ von LAION). Obwohl es einige Modelle gibt, die großartige Ergebnisse liefern, die anders aussehen als dieses Modell oder WaifuDiffusion (z. B. Midjorneys Anime-Modell, das nur in Form von ausgesuchten Bildern von ihnen erhältlich ist), so könnte dies möglich sein.

Es ist wichtig zu beachten, dass die Erzeugung mit höherer Auflösung die Qualität in anderen Aspekten als nur der Auflösung verbessert – z. B. werden die berüchtigten „KI-Hände“ besser. Ich frage mich, ob eine weitere Erhöhung auf 1024 x 1024 weitere Verbesserungen bringen würde. Etwas zu versuchen kann die Verwendung von kaskadierter Diffusion (z. B. Imagen ) im latenten Raum sein (z. B. 64 x 64 -> 128 x 128 -> 256 x 256 im latenten Raum, was 2048 x 2048 im ursprünglichen Raum ergibt).

Benutzerfreundlichkeit

Eine Sorge bei dem, was ich veröffentliche, ist, dass es sich um einen Proof-of-Concept handelt. Der Code für das Modell unterscheidet sich von SD, daher ist es mit den meisten Tools nicht wirklich kompatibel (insbesondere mit dem Prompt-Tokenizer-Teil). Obwohl dieses Modell besser aussieht als andere verfügbare Anime-Modelle, ist die Benutzerfreundlichkeit nicht so gut. Eine mögliche Lösung dafür wäre, dass die Community (oder ich, wenn ich Zeit dafür habe) es richtig in die vorhandenen Tools integriert oder es auf der Ebene der Schnittstelle mit SD kompatibel macht.

Verweise

  • Stabile Diffusion 2
  • Latente Diffusion
  • Danbooru2021-Datensatz
  • Anweisungen zum Aufrufen der Web-UI
  • Modellkontrollpunkte (Huggingface): 512x512 , 768x768 , Prompt Augmenter
  • SD Github Repo angepasst für das Modell
  • 768x768-Demo – eingeschränkt auf „Bewertung: Sicher“, ich werde es einige Zeit laufen lassen, aber schließlich werde ich es nicht mehr warten