Anifusion-SD

Dec 23 2022
TL; DR Il s'agit d'un nouveau modèle de type Stable-Diffusion (affiné à partir de SD2) pour les images d'anime, prenant en charge la résolution 768x768 et surpassant considérablement certains modèles d'anime populaires selon nos évaluations. Les points de contrôle sont publics (instructions d'installation), la démo est disponible depuis un certain temps.

TL; DR

Il s'agit d'un nouveau modèle de type Stable-Diffusion (affiné à partir de SD2) pour les images d'anime, prenant en charge la résolution 768x768 et surpassant considérablement certains modèles d'anime populaires selon nos évaluations. Les points de contrôle sont publics ( instructions d'installation ), la démo est disponible depuis un certain temps.

  • Introduction
  • Contexte
    - Modèles
    de diffusion - Diffusion latente
    - Diffusion stable
    - Diffusion Waifu
    - Diffusion stable 2
  • Notre modèle : entraînement
    - Conditionneur
    - Problèmes techniques et optimisations
    - Mise à jour de l'ensemble d'entraînement - Entraînement
    à plus haute résolution
    - Changements d'échantillonnage
  • Résultats
  • Comparaison avec d'autres modèles d'anime
  • Discussion
  • Les références
  • Pointeurs

Après mes expériences avec des modèles de diffusion de formation à partir de zéro, plusieurs personnes ont souligné qu'il existe un tas de versions de diffusion stable affinées sur les mêmes ensembles de données/similaires. En particulier:

  • Waifu Diffusion : il utilise un sous-ensemble relativement petit de données et alimente simplement l'invite de balise dans CLIP pour le conditionnement), sans aucune modification de code par rapport à la diffusion stable d'origine (c'est un problème pour l'OMI). Néanmoins, il semble être le modèle de diffusion d'anime le plus populaire en ce moment. Il a libéré le point de contrôle pour le public, contrairement au modèle suivant ;
  • NovelAI : cela est fait par une vraie entreprise, pas par des chercheurs/ingénieurs indépendants. Ils ne publient pas le modèle, mais lui fournissent une interface payante. Apparemment, il y a eu aussi un drame avec la fuite de leur point de contrôle et de leur code, à partir duquel il semble qu'ils aient apporté quelques petites modifications à la Stable Diffusion d'origine;
  • Anything-v3 : celui-ci est apparu un peu plus tard, il n'y a pas beaucoup d'informations sur le modèle, mais il est suspecté d'être affiné à partir de WaifuDiffusion (au moins, il utilise des transformations rapides similaires avant de le transmettre à CLIP). Il produit des images très détaillées et jolies, mais n'est pas très fidèle à l'invite. Son espace de sortie est très réduit (manquant de diversité, toutes les images ont le même style et se ressemblent), et rappelle les modèles GAN de pré-diffusion. Contrairement aux autres modèles, celui-ci est également incapable de générer NSFW - il a donc peut-être été obtenu en affinant sur un petit ensemble de données d'images de haute qualité par un seul artiste.

Cependant, vu l'abondance de modèles dans ce domaine, j'ai décidé dans un premier temps de ne pas m'embêter à m'impliquer et de laisser le progrès suivre son cours. Mais maintenant, Stable Diffusion 2 est sorti, et il n'y a toujours pas de progrès visibles dans les modèles d'anime. J'ai donc décidé de l'essayer - dans cet article, je décris comment j'ai affiné Stable Diffusion 2 avec un conditionneur d'invite personnalisé et je montre les résultats. Bien sûr, je publie également le modèle - d'après les quelques invites que j'ai essayées, c'était mieux que les modèles répertoriés ci-dessus. Les quelques sections suivantes se concentrent sur les détails techniques, si vous n'êtes pas intéressé, vous pouvez passer directement à Résultats .

Arrière plan

Pour comprendre ce qui se passe et ce qui a changé, commençons par un bref aperçu des modèles existants.

Modèles de diffusion

Je n'entrerai pas dans les détails des modèles de diffusion, il y a déjà beaucoup de bonnes critiques sur Internet. Pour nos besoins, il suffit de savoir que l'idée est de décomposer le processus de génération d'images en une séquence d'étapes de « débruitage ». Pendant la formation, la colonne vertébrale du modèle (dans le cas d'images - généralement un UNet) reçoit une image corrompue et l'étape de débruitage, et tente d'annuler une seule étape de corruption. Lors de l'inférence, nous partons d'un bruit aléatoire et appliquons le backbone à plusieurs reprises pour "annuler" toutes les étapes de corruption imaginaires. Les calculs exacts derrière cela doivent être précis. Au moment de l'inférence, la plupart des modèles de diffusion modernes modifient le processus pour réduire le nombre d'étapes d'échantillonnage (cela a été rendu possible par quelqu'un remarquant que le processus est étrangement similaire à la résolution d'une équation différentielle stochastique avec une méthode numérique, et a appliqué un solveur DE plus intelligent au lieu).

Diffusion latente

C'est sans doute l'idée la plus importante, utilisée dans la plupart des modèles de diffusion ouverte. Des entreprises comme Google ou OpenAI peuvent se permettre de former et d'utiliser des modèles de diffusion dans l'espace de pixels d'origine, car elles disposent de beaucoup de matériel. Mais pour un profane, former (ou même exécuter) UNet dans un espace de 512x512 pixels coûte très cher. L'idée est de former l'auto-encodeur qui comprime l'image de l'espace d'origine 512x512x3 vers un espace latent (en cas de diffusion stable - 64x64x4). L'auto-encodeur est formé comme un VAE avec une régularisation basée sur KL, pour garder l'espace latent « agréable ».

Ensuite, le modèle effectue la diffusion dans cet espace 64x64x4, ce qui est évidemment beaucoup plus efficace. L'inconvénient est que le VAE n'est pas parfait et que certaines informations sont perdues lors de la compression de l'image. Mais en pratique, cela fonctionne très bien.

FWIW, des approches alternatives sont possibles, par exemple Imagen génère une image de faible dimension dans l'espace des pixels, puis la met progressivement à l'échelle. Cependant, cela n'est pas pertinent pour le modèle que nous décrivons dans cet article.

Diffusion stable

C'était plus une percée sociale qu'une percée technique. Le modèle était un modèle de diffusion latente "vanille", entraîné sur LAION , et contrairement à la plupart des modèles de génération d'images précédents, il a été rendu public. Cela a rendu la technologie accessible à un large public non familiarisé avec l'apprentissage automatique, suscitant beaucoup de créativité, de discussions et de personnes l'ajustant sur divers ensembles de données (par exemple, les modèles d'anime mentionnés ci-dessus).

Un choix intéressant dans l'architecture qui est très pertinent pour nous est la façon dont le modèle effectue le conditionnement. Habituellement, les modèles sont entraînés à la fois dans les modes "inconditionnel" ( UNet(image corrompue) ~ image ) et conditionnel ( UNet(image corrompue, condition) ~ image ), et un guidage sans classificateur est utilisé lors de l'échantillonnage : au lieu d'utiliser UNet ( image corrompue , condition ) lors de la génération d'images, il utilise C * UNet ( image corrompue, condition ) ( C — 1) * UNet ( image corrompue ) et Cest significativement supérieur à 1 (par exemple 7). Ce n'est pas très intuitif, mais améliore considérablement à la fois la qualité de l'image et la fidélité rapide des images générées.

Ce qui nous intéresse, c'est la façon dont la condition est obtenue. En Stable Diffusion, ils utilisent la dernière couche cachée de l'encodeur de texte du modèle CLIP . Il est figé, c'est-à-dire que les gradients ne lui sont pas rétropropagés lors de l'apprentissage. Il peut être considéré comme un modèle d'encodeur de langage, avec quelques saveurs secondaires d'image biaisant la compréhension du langage vers la compréhension visuelle.

Diffusion Waifu

Il s'agit d'une diffusion stable affinée sur les images d'anime. Il semble qu'ils aient utilisé un sous-ensemble de Danbooru2021 (ou quelque chose de similaire) comme ensemble d'entraînement. Ils ont utilisé Stable Diffusion tel quel, sans aucune modification du code (ils ont cependant affiné la partie décodeur de VAE, pour qu'elle fonctionne un peu mieux avec les images animées).

En conséquence, ils utilisent de la même manière CLIP comme conditionneur, en lui fournissant une chaîne avec des balises comme invite. Je suppose que cela a assez mal fonctionné, car ils prétraitent également les balises (par exemple, en remplaçant les traits de soulignement par des espaces). Mais même avec cela, il semble que la compréhension CLIP de l'invite soit sous-optimale.

Diffusion stable 2

Il s'agit d'une version incrémentielle qui a recyclé le modèle (de la même taille) à partir de zéro et a également remplacé le conditionneur par OpenCLIP . Il possède également des fonctionnalités supplémentaires intéressantes, telles que img2img basé sur la profondeur et un modèle à plus haute résolution (768x768 pixels).

Notre modèle : la formation

L'objectif est d'affiner Stable Diffusion 2 sur les images animées, en remplaçant l'encodeur par un modèle personnalisé spécialisé pour l'ensemble de balises en entrée, par opposition au langage naturel du CLIP. Outre un meilleur conditionnement, cela permettrait également la technique d'augmentation rapide d' Anifusion , qui a tellement contribué à la qualité et à la diversité là-bas.

Conditionneur

Nous utilisons la même approche que dans Anifusion : le modèle de conditionnement est un transformateur de taille BERT sans intégrations positionnelles (pour capturer la symétrie des invites de balises : l'ordre des balises ne doit pas avoir d'importance). Nous remplaçons simplement le conditionneur, en gardant la même partie d'attention croisée de l'épine dorsale de diffusion.

Une question importante ici est de savoir comment initialiser le transformateur de poids. Partir du conditionneur non entraîné et de l'UNet entraîné et les entraîner conjointement peut conduire à la destruction ou à la dégradation significative des poids UNet par le processus d'entraînement. Heureusement, il n'est pas difficile de résoudre ce problème : nous pouvons geler l'UNet et exécuter la formation uniquement pour la partie transformateur pendant un certain temps.

Problèmes techniques et optimisations

Pour rendre l'entraînement efficace, il est important de presser une taille de lot aussi élevée que possible sur la RAM vidéo (par exemple, parce que le coût d'application de la logique d'optimisation n'est payé qu'une seule fois par lot). Il y a essentiellement deux directions ici.

Changements de pipeline

Le code de formation SD canonique exécute l'encodeur VAE en ligne, analysant l'image brute et l'encodant. C'est le fruit le plus bas dont il faut se débarrasser : les poids VAE consomment de la VRAM, les variables intermédiaires de l'application de cet encodeur consomment également de la VRAM, le processus d'encodage prend du temps. En particulier, si nous effectuons plusieurs passages sur les données, cela n'a aucun sens de payer le coût d'encodage de la même image plusieurs fois.

Heureusement, cette partie est facile à optimiser : nous pré-encodons simplement toutes les images de l'ensemble d'apprentissage. L'avantage supplémentaire est que l'ensemble d'apprentissage résultant est beaucoup plus petit (en termes de taille de disque) que les images 512x512 d'origine dans l'espace de pixels.

Une autre façon d'économiser un peu de VRAM consiste à désactiver l'EMA. La moyenne mobile exponentielle est une astuce pour améliorer légèrement la qualité du modèle en faisant la moyenne (approximativement) des poids d'un tas de derniers points de contrôle, et ne pas stocker l'EMA est un moyen facile d'utiliser moins de VRAM sans trop nuire au modèle résultant.

Changements de formation

Un moyen populaire d'accélérer la formation et d'économiser de la VRAM consiste à utiliser une précision inférieure : plutôt que les fp32 habituels (nombres à virgule flottante 32 bits), utilisez fp16 ou bf16 (variations de nombres à virgule flottante 16 bits) ou une précision mixte (effectuer certaines opérations dans fp16).

Je l'ai essayé, et cela améliore effectivement les performances, mais c'est beaucoup trop dangereux. En particulier, à un moment donné, j'ai ajouté "with torch.autocast():" (précision mixte) pour attirer l'attention, puis j'ai perdu un certain temps à comprendre pourquoi le modèle diverge lentement au fil du temps.

En conséquence, j'ai décidé qu'il serait plus sûr de ne pas appliquer d'optimisations de cette nature au modèle, étant donné que la formation était déjà assez efficace.

Mise à jour de l'ensemble d'entraînement

Dans Anifusion, une ancienne version de l' ensemble de données Danbooru a été utilisée, j'ai donc décidé que c'était le bon moment pour le mettre à jour, tout en étendant la taille de l'ensemble de formation et l'ensemble des balises prises en charge dans l'invite. Il y avait cependant quelques complications : (1) la nouvelle version de l'ensemble de données n'était pas un simple sur-ensemble de la précédente, et (2) j'ai décidé de le faire pendant que le modèle était déjà en cours d'entraînement, donc un travail supplémentaire pour faire la transition de l'existant point de contrôle était nécessaire.

Différences entre les ensembles de données

C'est un peu mineur, mais après avoir téléchargé les métadonnées pour la nouvelle version du jeu de données, j'ai remarqué qu'un tas d'images (quelques pour cent) avaient disparu. Certaines balises qui figuraient dans le top 2,5k auparavant ont également disparu (y compris certaines des plus populaires), de plus, les images supprimées correspondaient aux balises supprimées.

Une inspection plus approfondie a révélé que les balises disparues correspondaient toutes au modèle "fringy NSFW" (certaines d'entre elles étaient si franges que je ne savais même pas que de telles choses existaient…). C'était un peu incohérent, car d'autres balises et images de nature similaire étaient conservées en place. Je suppose que le responsable de l'ensemble de données ou le site d'hébergement de l'image source l'a implémenté comme un hack rapide pour résoudre certains problèmes de relations publiques. Quoi qu'il en soit, j'ai juste pris l'union d'anciens et de nouveaux ensembles de données, obtenant environ 2 millions d'images pour m'entraîner. De plus, j'ai échantillonné 800k images avec une résolution ≥ 786x768, pour affiner le modèle à plus haute résolution plus tard.

Extension du jeu de balises

Cette section est en fait un peu non triviale. Au moment où le nouvel ensemble de données a été produit, le modèle a été formé pendant un certain temps, avec un transformateur de conditionneur bien convergé, prenant les invites des balises top-2.5k comme entrées. Pour la nouvelle version, j'ai décidé de prendre les balises top-12k à la place. Comment les ajouter au modèle ?

Ce qu'il faut faire évoluer, c'est la table d'encastrement du transformateur (de 2500x1024 à 12000x1024). Une approche naïve consiste à initialiser de manière aléatoire les nouveaux plongements et à former le modèle pendant un certain temps avec l'UNet gelé, en ne mettant à jour que le transformateur. Mais c'est (1) une perte de temps et de calcul, (2) ennuyeuse. Peut-on mieux les initialiser ?

Voyons quelles informations nous sont disponibles. Nous avons déjà entraîné des incorporations de 2,5 k, et les intégrations des nouvelles balises devraient leur ressembler quelque peu. Mais à qui ? Une idée naïve consiste à utiliser les incorporations de balises sémantiquement similaires. Mais comment obtient-on une similarité sémantique ? Le bon vieux word2vec est très bon dans ce domaine, nous pouvons donc simplement prendre les ensembles de balises et entraîner les intégrations word2vec sur eux. Ci-dessous une visualisation t-SNE du résultat (les points sombres correspondent aux balises NSFW, de sorte qu'il est facile de les ignorer pour les personnes qui ne veulent pas les regarder) : lien interactif .

Regardons la même visualisation pour les intégrations formées 2.5k du transformateur : lien interactif .

Ce n'est donc pas vraiment le même, et l'accent est davantage mis sur l'apparence visuelle que sur la sémantique. Cependant, il doit être suffisamment proche pour que nous puissions calculer les plongements initiaux pour les nouvelles balises comme suit : prenez les voisins les plus proches dans l'espace word2vec parmi les 2,5 000 top et agrégez leurs plongements de transformateurs. En fait, nous pouvons même l'améliorer un peu : former un petit NN qui transforme word2vec afin que l'agrégation du voisin le plus proche corresponde à la véritable intégration sur les 2,5 k premiers, et l'applique au reste des balises.

Avec cela, nous obtenons une initialisation raisonnable pour les nouveaux plongements, modifions le dernier point de contrôle et reprenons la formation sur les nouvelles données telles quelles.

Entraînement haute résolution

Stable Diffusion 2 en a une version qui génère des images de taille 768x768 (c'est-à-dire 2,25 fois plus grandes que 512x512), qui a des propriétés intéressantes (par exemple, il semble mieux gérer le dessin des doigts que la version à plus basse résolution). Nous avons donc décidé de faire de même avec notre modèle. En particulier, nous avons deux étapes de la formation :

  • Basse résolution : apprentissage sur images 512x512 (espace latent 64x64x4), avec taille de lot 11, taux d'apprentissage 5e-6, pour 1 million de pas ;
  • Haute résolution : en reprenant la phase précédente, entraînez-vous sur des images 768 x 768 (espace latent 96 x 96 x 4), avec une taille de lot de 5, un taux d'apprentissage de 5e-6, 80 000 étapes.

Changements d'échantillonnage

Dans Anifusion , l'augmentation de l'invite avec un modèle séparé a considérablement amélioré les résultats. Intuitivement, il est plus facile d'échantillonner des choses dans l'espace conceptuel discret, par opposition à l'espace continu implicite à l'intérieur du processus de diffusion.

Ici, nous appliquons la même technique, en réentraînant le transformateur d'augmentation rapide sur le nouvel ensemble d'entraînement. Nous observons le même effet - la qualité et la diversité des échantillons augmentent considérablement avec l'augmentation des invites, en particulier pour les invites courtes.

Résultats

Il apparaît que le modèle 768x768 produit de meilleures images que le modèle 512x512, et pas seulement à cause de la résolution : la cohérence globale des images et (surtout) les détails anatomiques des personnages sont meilleurs. Cependant, il semble que la fidélité rapide soit légèrement pire (je n'ai cependant pas de mesures appropriées, juste mon impression).

Une chose à noter est que par rapport à Anifusion, le modèle semble être plus biaisé vers les images NSFW/racy. Une partie peut être attribuée à une augmentation rapide, mais la partie UNet est également responsable. Je ne sais pas pourquoi cela se produit (les changements d'ensemble d'entraînement étaient plutôt petits ; peut-être que la taille/à partir de Stable Diffusion en est la cause ?).

Passons en revue les différents types d'images étape par étape.

Portraits

Il s'agit du cas d'utilisation le plus simple, et les portraits d'anime ont été générés avec succès même à l'ère du GAN. Donc, sans surprise, le modèle n'a aucun problème avec cela (quelques exemples ci-dessous).

Caractère unique, balises populaires

C'est un test plus difficile, et comme prévu, on peut obtenir de mauvaises images de temps en temps (rarement). Un mode de défaillance courant est une mauvaise anatomie - un bras ou une jambe supplémentaire. Et bien sûr, les doigts sont assez difficiles pour le modèle.

Caractère unique, balises de queue

Ici, nous testons des balises moins populaires, en particulier celles qui ont été ajoutées aux dernières étapes de la formation (voir ci-dessus pour plus de détails). Ils semblent fonctionner assez bien, même s'ils ne sont pas parfaits. Quelques exemples sont ci-dessous. En général, il apparaît que les balises de caractères sont plus faciles pour le modèle que les balises de concept.

Balises nouvellement ajoutées, de gauche à droite : "lion" (peu clair, peut-être qu'elle le chevauche), "facepalm" (n'a pas fonctionné), "venti_(genshin_impact)" (a fonctionné)

Interactions avec les personnages

Enfin, nous arrivons à quelque chose d'intéressant. Original Anifusion ne fonctionnait pas bien lorsque les personnages interagissaient. Le nouveau modèle est-il meilleur ?

Plusieurs personnages juste côte à côte semblent être OK :

Des actions simples fonctionnent aussi quelque peu :

De gauche à droite : « kiss », « holding_hands », « hug »

Les interactions avec les objets sont également plus ou moins fines :

De gauche à droite : « holding_gun », « riding », « holding_food »

Cependant, si nous essayons de spécifier des interactions compliquées, cela produit le plus souvent une horreur corporelle (je ne publierai pas ces images ici, car elles peuvent être dérangeantes). Pourquoi cela arrive-t-il? Je suppose que c'est parce que les invites ne sont que des ensembles de balises et ne spécifient pas assez précisément les interactions. Ce qui a permis aux modèles de diffusion de produire de bonnes images en premier lieu, c'est le guidage sans classificateur : la suraccentuation des invites a considérablement amélioré la qualité par rapport à l'échantillonnage sans invite, car il est difficile d'échantillonner des concepts compliqués à l'intérieur de la diffusion. Nous pouvons donc nous attendre à ce que tout ce qui est spécifié sans ambiguïté dans l'invite soit bien généré, mais les ambiguïtés seront résolues d'une manière pas si agréable. L'incitation en langage naturel peut être meilleure dans ce sens.

FWIW, dans les commentaires du post original d'Anifusion sur reddit, Gwern a suggéré d'utiliser BLIP pour générer des invites en langage naturel à partir des images ; En fait, je l'ai essayé, et la qualité des invites était extrêmement faible, donc ce n'est pas si facile.

modes

Dans la Stable Diffusion originale, les gens ont trouvé de nombreuses façons de spécifier des styles au modèle, principalement en ajoutant les noms de certains artistes. Est-ce que la même chose fonctionne pour le modèle d'anime?

Essayer — ça marche très bien (c'est un avantage par rapport à AnythingV3). Vous trouverez ci-dessous des exemples dans divers styles aléatoires.

Comparaison avec d'autres modèles d'anime

Nous ne faisons pas de comparaison avec AnythingV3, car il ne respecte pas vraiment l'invite, générant des images similaires pour à peu près n'importe quoi (comme son nom l'indique). Cela laisse WaifuDiffusion et NovelAI. Nous avons décidé de ne pas comparer avec NovelAI, car cela nécessiterait d'utiliser le point de contrôle divulgué, et il vaut mieux rester à l'écart de ce drame. Cela nous laisse avec WaifuDiffusion.

Une chose à noter est que la comparaison sur les invites courtes serait trop injuste pour WaifuDiffusion : elle n'inclut pas l'augmentation des invites (contrairement à Anifusion), ce qui donne des résultats très médiocres sur les invites courtes. Nous faisons donc deux comparaisons différentes à la place. Dans l'un, nous échantillonnons des ensembles de balises à partir de l'ensemble de données d'origine, supprimant efficacement l'augmentation rapide de la considération et comparant uniquement la partie diffusion. Dans le second, nous construisons manuellement des invites de taille moyenne et évaluons les deux modèles sur celles-ci (cela inclut l'effet de l'augmentation des invites).

Ensembles de balises de l'ensemble de données

Nous échantillonnons 97 ensembles de balises à partir de l'ensemble de données (uniformément, en filtrant les images classées comme "sûres"). Pour Anifusion, nous les prétraitons en ajoutant "rating_s, score_perc_100, adjust_score_perc_100" à l'invite. Pour WaifuDiffusion, nous les prétraitons en remplaçant les traits de soulignement par des espaces. Dans les deux cas, nous utilisons un échantillonnage DDIM avec 50 étapes et une échelle de guidage sans classificateur 9.

Après avoir obtenu quelques évaluations humaines (avec retournement aléatoire des côtés pour comparaison), nous obtenons les résultats suivants vs Waifu :

  • L'anifusion c'est mieux : 30%
  • Waifu est meilleur : 24%
  • À peu près la même chose : 46 %

Un modèle d'échec que j'ai remarqué dans Waifu : il génère souvent une sous-image au lieu d'une image complète, tronquant la tête du personnage. Un modèle d'échec d'Anifusion est un NSFW non sollicité (et connexe - mauvaise anatomie; pour une raison quelconque, plus l'image est proche de NSFW, plus le modèle obtient l'anatomie).

Remarque : ici, vous pouvez trouver les résultats AnythingV3 pour les mêmes invites. Les résultats semblent bons, mais on peut comprendre pourquoi j'hésite à les inclure dans les comparaisons : toutes les images semblent être exactement dans le même style, manquant cruellement de diversité, ce qui signifie que le modèle a un espace de sortie beaucoup plus petit.

Donc, avec l'échantillonnage en distribution, ce n'est pas radicalement mieux. Mais que se passe-t-il si nous utilisons la version haute résolution du modèle ?

  • L'anifusion est meilleure : 41%
  • Waifu est meilleur : 13%
  • À peu près la même chose : 46 %

On peut remarquer qu'il y a une quantité non négligeable de "à peu près la même chose". La plupart de ces exemples sont que les deux modèles sont également bons, mais il y en a certains où les deux modèles sont horriblement mauvais (d'une manière ou d'une autre, ils sont corrélés en cela).

Invites manuelles de taille moyenne

Nous utilisons le même prétraitement d'invite que celui décrit dans la section précédente. Nous préparons manuellement 33 invites raisonnables de taille moyenne (bien sûr, puisqu'elles sont préparées par une seule personne, elles peuvent ne pas être représentatives de la distribution globale).

Ici, les résultats sont très différents :

  • L'anifusion est meilleure : 73%
  • Waifu c'est mieux : 9%
  • À peu près la même chose : 18 %

Comme nous pouvons le voir, une augmentation rapide fait une différence. Que se passe-t-il si nous utilisons le modèle haute résolution ? Les résultats sont assez similaires ( données brutes ):

  • L'anifusion est meilleure : 73%
  • Waifu c'est mieux : 3%
  • À peu près la même chose : 24 %

Accessibilité pour les profanes

Une observation intéressante est que même après un million de mini-lots d'apprentissage, le modèle continue de s'améliorer. Il n'est pas clair si le modèle se souvient de quoi que ce soit du point de contrôle de diffusion stable d'origine après tant d'étapes. Peut-être que l'ensemble de données d'anime est suffisamment simple pour former des modèles de diffusion de taille SD à partir de zéro sur du matériel de base, sans le démarrage à chaud de la SD existante ? C'est une direction qui mériterait d'être explorée : si tel est le cas, essayer de nouvelles architectures pour les particuliers devrait devenir plus facile, sans avoir à dépenser des millions de dollars en calcul, comme c'est le cas avec la formation basée sur LAION.

Améliorations supplémentaires de la qualité

Il est intéressant de voir jusqu'où il est possible d'aller avec le modèle actuel, donc je veux l'affiner un peu plus, éventuellement en utilisant l'ensemble de données complet, plutôt que le sous-ensemble 2M. Mais je soupçonne que le facteur limitant est la qualité de l'ensemble de données, pas la quantité de réglage fin (c'est-à-dire que pour améliorer la qualité du modèle, il faudrait soit alimenter uniquement des images de meilleure qualité, soit ajouter un identifiant spécial au conditionneur qui aide le modèle pour distinguer les meilleures images des moins bonnes). À ma connaissance, il n'existe pas de modèles fiables comme celui-ci pour l'anime (pour les images générales, les gens utilisent le sous-ensemble "esthétique" de LAION). Bien que certains modèles produisent d'excellents résultats qui semblent différents de ce modèle ou de WaifuDiffusion (par exemple, le modèle d'anime de Midjorney, qui n'est disponible que sous forme d'images sélectionnées par eux), cela pourrait donc être possible.

Il est important de noter que la génération à plus haute résolution améliore la qualité dans des aspects autres que la simple résolution - par exemple, les fameuses «mains IA» s'améliorent. Je me demande si l'augmenter davantage à 1024x1024 apporterait plus d'améliorations. Quelque chose à essayer peut être d'utiliser la diffusion en cascade (par exemple Imagen ) dans l'espace latent (par exemple 64x64 -> 128x128 -> 256x256 dans l'espace latent, donnant 2048x2048 dans l'espace d'origine).

Convivialité

Une préoccupation avec ce que je publie est qu'il s'agit d'une preuve de concept. Le code du modèle est différent de SD, il n'est donc pas vraiment compatible avec la plupart des outils (en particulier, la partie prompt tokenizer). Ainsi, même si ce modèle est plus beau que les autres modèles d'anime disponibles, la facilité d'utilisation n'est pas aussi grande. Une solution potentielle à cela serait que la communauté (ou moi, si j'en ai le temps) l'intègre correctement avec les outils existants, ou le rende compatible avec SD au niveau de l'interface.

Les références

  • Diffusion stable 2
  • Diffusion latente
  • Jeu de données Danbooru2021
  • Instructions pour afficher l'interface utilisateur Web
  • Points de contrôle du modèle (huggingface) : 512 x 512 , 768 x 768 , augmentation rapide
  • Repo SD Github adapté pour le modèle
  • Démo 768x768 - limitée à "classement : sûr", je vais le faire fonctionner pendant un certain temps, mais finalement je ne le maintiendrai pas