Dans ce billet, nous examinerons les applications de l'utilisation de VQGAN combinée avec les modèles de diffusion par absorption discrète de l'incroyable article :
Si vous êtes curieux de connaître les techniques astucieuses qui ont rendu cela possible, l'article lui-même et notre article de blog technique vous intéresseront certainement ! Dans le billet de blog technique, nous avons donné un aperçu des modèles génératifs SOTA précédents, pour ensuite arriver à une nouvelle classe de modèles, les modèles de diffusion. Nous avons approfondi l'architecture des modèles de diffusion à absorption discrète. Dans ce billet, nous prendrons un peu de recul et nous verrons comment nous pouvons exploiter les caractéristiques de ce modèle à des fins créatives.
Dans le billet techniqueI, nous avons discuté de deux modèles :
Dans le billet technique, nous avons vu qu'un modèle de diffusion discrète ne génère pas ces codes latents de gauche à droite, comme un modèle autorégressif, mais peut les générer dans un ordre aléatoire.
Cet échantillonnage désordonné et bidirectionnel nous permet d'utiliser de nouvelles techniques pour éditer et générer des images:
Comme dans la plupart des modèles génératifs, nous pouvons générer des images à partir de zéro. Le modèle de diffusion commence par une grille vide de 1I6x16, désignée par les jetons MASK, et génère itérativement des jetons pour remplir la grille. Une fois que chaque code est généré, le décodeur VQGAN utilise ces codes générés pour créer des images globalement cohérentes et compétitives par rapport à d'autres modèles génératifs.
Parlons maintenant de la génération conditionnelle d'images. C'est une façon élégante de dire que nous choisissons une partie de l'image pour orienter la génération du reste de l'image.
Avec les modèles autorégressifs existants, il est possible d'utiliser la génération conditionnelle d'images sur la base d'une image partielle. L'idée est ici de donner au modèle la partie supérieure d'une image comme contexte, puis de compléter le contenu en prédisant les pixels suivants un par un, de haut en bas et de gauche à droite. Au lieu de prédire des pixels, nous pourrions également prédire des codes discrets de manière unidirectionnelle, une idée qui a été explorée dans l'article : Apprivoiser les transformateurs pour la synthèse d'images à haute résolution.
Impressionnant, non ? Cependant, il n'est possible de conditionner que la partie supérieure d'une image, en raison de la nature unidirectionnelle des modèles autorégressifs.
C'est là que notre modèle de diffusion peut faire mieux ! Nous pouvons coder une image avec le codeur VQGAN, ce qui nous donne une grille de variables latentes. Nous choisissons ensuite les parties de l'image que nous voulons conserver et laissons le modèle générer tout ce qui l'entoure.
Il s'agit d'une amélioration considérable de la flexibilité par rapport aux modèles autorégressifs, puisque nous ne sommes plus limités à des parties spécifiques d'une image. À titre de démonstration, dans la figure suivante, nous voulons conserver la tour au milieu avec différents arrière-plans générés. Nous conservons les codes de la région centrale 🏯, remplaçons les autres codes par la valeur MASK et demandons au modèle de générer plusieurs nouvelles images.
Comme vous pouvez le voir, le contenu et la structure de la région centrale restent fixes la plupart du temps, ne s'adaptant que légèrement pour mieux correspondre aux pixels environnants. C'est génial de dire au modèle ce qu'il doit faire 😎 !
De manière similaire à la génération d'images conditionnelles, nous pouvons également effectuer un inpainting d'image 🎨🖌.
Supposons que nous générions une image et que nous en aimions la majeure partie, à l'exception d'une région qui ne nous semble pas tout à fait correcte. Pas de problème, nous pouvons simplement masquer les codes latents de la grille qui correspondent à cette région indésirable et laisser le modèle de diffusion les régénérer. Pour montrer comment cela fonctionne, générons de nouvelles bouches ! En régénérant ces codes plusieurs fois, nous pouvons obtenir de nombreuses variations.
Très cool ! Nous obtenons 9 nouvelles images avec exactement les mêmes cheveux, les mêmes yeux et le même fond mais avec des bouches complètement différentes 👄 .
C'est maintenant que les choses sérieuses commencent. En raison de la structure en grille de l'espace latent du VQGAN, les codes appris par le VQGAN sont fortement corrélés spatialement au contenu des images générées. Cela signifie que les codes latents qui correspondent à la région des yeux d'un visage généré contiendront des informations sur les yeux.
D'accord, mais maintenant quoi ? Prenons les codes latents des 👀 de l'image A et les codes des 👄 de l'image B. Plaçons-les dans une grille, masquons tous les autres tokens et laissons notre modèle de diffusion faire ce qu'il sait faire de mieux.
Nous constatons que le modèle de diffusion a bien rempli les régions masquées pour créer un visage cohérent tout en restant fidèle à l'aspect original de la bouche et des yeux.
Soyons créatifs et appliquons cette idée à un modèle formé sur les églises. Le pape veut que vous construisiez une nouvelle église et il aime particulièrement la base de la célèbre Notre-Dame de Paris et la tour de la magnifique cathédrale Sint-Baafs de Gand. Pas de problème, il suffit d'extraire les codes correspondant aux régions souhaitées et de les coller sur un espace latent vide.
Il ne reste plus qu'à demander au modèle de diffusion de remplir les régions vides et de les décoder avec la VQ-VAE, et vous pouvez facilement générer une quantité infinie de nouvelles églises qui respectent les contraintes.
Comme vous pouvez le voir, le contenu des tours et de la base reste le même et le modèle remplit le reste de manière réaliste. Le pape est très satisfait du résultat et vous offre un billet VIP pour éviter la file d'attente aux portes de Saint-Pierre. Un travail bien fait ! Si vous souhaitez obtenir des résultats plus fous, vous pouvez ajuster la température d'échantillonnage du modèle de diffusion afin d'obtenir davantage de variations (tout en sacrifiant une certaine cohérence globale).
La dernière application intéressante de ce modèle est qu'il nous permet de générer des images plus grandes que les images sur lesquelles le modèle a été entraîné. Pour ce faire, nous divisons l'espace latent de l'image plus grande en plusieurs grilles qui se chevauchent et qui correspondent à la forme originale de 16x16. À chaque étape de prédiction, nous calculons les probabilités des nouveaux jetons et les agrégeons dans les différentes grilles.
Cette astuce nous permet de générer des images globalement cohérentes, même si le modèle n'a jamais été entraîné pour cela.
Dans ce billet, nous avons examiné comment la nature bidirectionnelle et itérative des modèles de diffusion récemment apparus, combinée aux représentations discrètes des VQGAN et aux capacités de modélisation à longue portée des transformateurs , nous permet d'avoir un meilleur contrôle sur l'espace latent. Cette architecture produit des images de haute qualité et cohérentes tout en ajoutant la possibilité d'éditer des images dans un espace conceptuel discret.
Gardez l'œil ouvert, car ce n'est pas la dernière fois que vous verrez ces modèles de diffusion (en fait, plusieurs nouveaux articles étonnants ont été publiés pendant la rédaction de ce billet, comme DALL-E 2, ImageGen, Stable Diffusion...). Et n'oubliez pas de consulter le billet technique pour savoir ce qui se passe en coulisses!🤓