Vue d'ensemble
Dans cette unitĂ©, vous allez dĂ©couvrir un puissant modĂšle de diffusion appelĂ© Stable Diffusion (SD) et explorer ce quâil peut faire.
Vue dâensemble de cette unitĂ©
Les différentes étapes à suivre pour cette unité :
- Lisez le matĂ©riel ci-dessous pour avoir une vue dâensemble des idĂ©es clĂ©s de cette unitĂ©
- Consultez le notebook Introduction Ă Stable Diffusion pour voir lâapplication pratique de SD dans des cas dâutilisation courants.
- (Facultatif) Consultez la vidĂ©o Stable Diffusion Deep Dive (en anglais) et le notebook qui lâaccompagne pour une exploration plus approfondie des diffĂ©rents composants et de la façon dont ils peuvent ĂȘtre adaptĂ©s Ă diffĂ©rents effets. Ce matĂ©riel a Ă©tĂ© créé pour le cours de FastAI, Stable Diffusion from the Foundations (en anglais), ce qui en fait un excellent complĂ©ment Ă ce cours pour tous ceux qui sont curieux de construire ce type de modĂšles Ă partir de zĂ©ro.
Introduction

Exemples dâimages gĂ©nĂ©rĂ©es Ă lâaide de Stable Diffusion
Stable Diffusion est un puissant modÚle de diffusion latent conditionné par le texte. Ne vous inquiétez pas, nous expliquerons ces mots dans quelques instants ! Sa capacité à créer des images étonnantes à partir de descriptions textuelles en a fait une sensation sur Internet. Dans cette unité, nous allons explorer le fonctionnement du modÚle de diffusion latent et voir quels sont ses autres atouts.
Diffusion latente
Plus la taille des images augmente, plus la puissance de calcul nĂ©cessaire pour travailler avec ces images sâaccroĂźt. Ceci est particuliĂšrement prononcĂ© dans une opĂ©ration appelĂ©e auto-attention, oĂč le nombre dâopĂ©rations croĂźt de façon quadratique avec le nombre dâentrĂ©es. Une image carrĂ©e de 128 pixels a 4 fois plus de pixels quâune image carrĂ©e de 64 pixels, et nĂ©cessite donc 16 fois (câest-Ă -dire 4ÂČ) la mĂ©moire et le calcul dans une couche dâauto-attention. Ce problĂšme se pose pour tous ceux qui souhaitent gĂ©nĂ©rer des images en haute rĂ©solution !

Diagramme provenant du papier High-Resolution Image Synthesis with Latent Diffusion Models
La diffusion latente permet dâattĂ©nuer ce problĂšme en utilisant un modĂšle distinct appelĂ© auto-encodeur variationnel (VAE pour Variational Auto-Encoder) pour compresser les images dans une dimension spatiale plus petite. Le raisonnement sous-jacent est que les images ont tendance Ă contenir une grande quantitĂ© dâinformations redondantes. Avec suffisamment de donnĂ©es dâentraĂźnement, un VAE peut espĂ©rer apprendre Ă produire une reprĂ©sentation beaucoup plus petite dâune image dâentrĂ©e et ensuite reconstruire lâimage sur la base de cette petite reprĂ©sentation latente avec un haut degrĂ© de fidĂ©litĂ©. Le VAE utilisĂ© dans SD prend des images Ă 3 canaux et produit une reprĂ©sentation latente Ă 4 canaux avec un facteur de rĂ©duction de 8 pour chaque dimension spatiale. En dâautres termes, une image dâentrĂ©e carrĂ©e de 512 pixels sera compressĂ©e en une reprĂ©sentation latente de 4x64x64.
En appliquant le processus de diffusion Ă ces reprĂ©sentations latentes plutĂŽt quâĂ des images en pleine rĂ©solution, nous pouvons bĂ©nĂ©ficier de nombreux avantages liĂ©s Ă lâutilisation dâimages plus petites (moins dâutilisation de mĂ©moire, moins de couches nĂ©cessaires dans le UNet, des temps de gĂ©nĂ©ration plus rapidesâŠ) tout en dĂ©codant le rĂ©sultat en une image en haute rĂ©solution une fois que nous sommes prĂȘts Ă voir le rĂ©sultat final. Cette solution permet de rĂ©duire considĂ©rablement le coĂ»t de lâentraĂźnement et dâexĂ©cution de ces modĂšles.
Conditionnement
Dans lâunitĂ© 2, nous avons montrĂ© comment lâapport dâinformations supplĂ©mentaires au UNet nous permet dâexercer un contrĂŽle supplĂ©mentaire sur les types dâimages gĂ©nĂ©rĂ©es. Câest ce que nous appelons le conditionnement. Ătant donnĂ© une version bruitĂ©e dâune image, le modĂšle est chargĂ© de prĂ©dire la version dĂ©bruitĂ©e en fonction dâindices supplĂ©mentaires tels quâune Ă©tiquette de classe ou, dans le cas de Stable Diffusion, une description textuelle de lâimage. Au moment de lâinfĂ©rence, nous pouvons introduire la description dâune image que nous aimerions voir et un peu de bruit pur comme point de dĂ©part, et le modĂšle fait de son mieux pour « dĂ©bruiter » lâentrĂ©e alĂ©atoire en quelque chose qui corresponde Ă la lĂ©gende.

Diagramme montrant le processus dâencodage de texte qui transforme le prompt dâentrĂ©e en un ensemble dâenchĂąssements de texte (les encoder_hidden_states) qui peuvent ensuite ĂȘtre introduits dans lâUNet en tant que condition.
Pour que cela fonctionne, nous devons crĂ©er une reprĂ©sentation numĂ©rique du texte qui capture des informations pertinentes sur ce quâil dĂ©crit. Pour ce faire, SD sâappuie sur un transformer prĂ©-entraĂźnĂ© basĂ© sur ce que lâon appelle CLIP. Lâencodeur textuel de CLIP a Ă©tĂ© conçu pour traiter les lĂ©gendes dâimages sous une forme pouvant ĂȘtre utilisĂ©e pour comparer les images et le texte, il est donc bien adaptĂ© Ă la tĂąche de crĂ©ation de reprĂ©sentations utiles Ă partir de descriptions dâimages. Un prompt est dâabord tokenizer (sur la base dâun large vocabulaire oĂč chaque mot ou sous-mot se voit attribuer un token spĂ©cifique), puis transmis Ă lâencodeur textuel de CLIP, qui produit un vecteur Ă 768 dimensions (dans le cas de SD 1.X) ou Ă 1024 dimensions (SD 2.X) pour chaque tokens. Pour que les choses restent cohĂ©rentes, les prompts sont toujours rembourrĂ©s/tronquĂ©s pour avoir une longueur de 77 tokens, de sorte que la reprĂ©sentation finale que nous utilisons comme conditionnement est un tenseur de forme 77x1024 par prompt.

Alors, comment introduire ces informations de conditionnement dans lâUNet pour quâil les utilise dans ses prĂ©dictions ? La rĂ©ponse est ce que lâon appelle lâattention croisĂ©e. Des couches dâattention croisĂ©e sont dissĂ©minĂ©es dans lâUNet. Chaque emplacement spatial de lâUNet peut « sâintĂ©resser » Ă diffĂ©rents tokens dans le conditionnement du texte, en apportant des informations pertinentes provenant du prompt. Le diagramme ci-dessus montre comment ce conditionnement textuel (ainsi que le conditionnement basĂ© sur le temps) est fourni Ă diffĂ©rents endroits. Comme vous pouvez le constater, Ă chaque niveau, lâUNet a de nombreuses possibilitĂ©s dâutiliser ce conditionnement !
Guidage sans classification
Il sâavĂšre que mĂȘme avec tous les efforts dĂ©ployĂ©s pour rendre le texte de conditionnement aussi utile que possible, le modĂšle a toujours tendance Ă sâappuyer principalement sur lâimage dâentrĂ©e bruyante plutĂŽt que sur le prompt lorsquâil fait ses prĂ©dictions. Dâune certaine maniĂšre, de nombreuses lĂ©gendes ne sont que vaguement liĂ©es aux images qui leur sont associĂ©es et le modĂšle apprend donc Ă ne pas trop sâappuyer sur les descriptions ! Toutefois, cela nâest pas souhaitable lorsquâil sâagit de gĂ©nĂ©rer de nouvelles images : si le modĂšle ne suit pas le prompt, nous risquons dâobtenir des images qui ne sont pas du tout liĂ©es Ă notre description.

Images gĂ©nĂ©rĂ©es Ă partir du prompt « Une peinture Ă lâhuile dâun colley avec un chapeau haut de forme » avec lâĂ©chelle CFG 0, 1, 2 et 10 (de gauche Ă droite)
Pour rĂ©soudre ce problĂšme, nous utilisons une astuce appelĂ©e « Classifier-Free Guidance » (CGF). Pendant lâentraĂźnement, le conditionnement du texte est parfois laissĂ© en blanc, ce qui oblige le modĂšle Ă apprendre Ă dĂ©bruiter les images sans aucune information textuelle (gĂ©nĂ©ration inconditionnelle). Ensuite, au moment de lâinfĂ©rence, nous faisons deux prĂ©dictions distinctes : lâune avec le texte prompt comme conditionnement et lâautre sans. Nous pouvons ensuite utiliser la diffĂ©rence entre ces deux prĂ©dictions pour crĂ©er une prĂ©diction combinĂ©e finale qui pousse encore plus loin dans la direction indiquĂ©e par la prĂ©diction conditionnĂ©e par le texte selon un certain facteur dâĂ©chelle (lâĂ©chelle de guidage), avec lâespoir dâobtenir une image qui corresponde mieux au prompt. Lâimage ci-dessus montre les rĂ©sultats dâun prompt Ă diffĂ©rentes Ă©chelles de guidage. Comme vous pouvez le voir, des valeurs plus Ă©levĂ©es donnent des images qui correspondent mieux Ă la description.
Autres types de conditionnement : super-rĂ©solution, peinture et profondeur dâimage
Il est possible de crĂ©er des versions de Stable Diffusion qui prennent en compte dâautres types de conditionnement. Par exemple, le modĂšle Depth-to-Image model possĂšde des canaux dâentrĂ©e supplĂ©mentaires qui recueillent des informations approfondies sur lâimage en cours de dĂ©bruitage et, au moment de lâinfĂ©rence, nous pouvons introduire la carte de profondeur dâune image cible (estimĂ©e Ă lâaide dâun modĂšle distinct) pour espĂ©rer gĂ©nĂ©rer une image dont la structure globale est similaire.

SD conditionnĂ© par la profondeur est capable de gĂ©nĂ©rer des images diffĂ©rentes avec la mĂȘme structure globale (exemple provenant de StabilityAI)
De la mĂȘme maniĂšre, nous pouvons introduire une image basse rĂ©solution comme conditionnement et demander au modĂšle de gĂ©nĂ©rer la version haute rĂ©solution (comme utilisĂ© par le Stable Diffusion Upscaler). Enfin, nous pouvons introduire un masque montrant une rĂ©gion de lâimage Ă rĂ©gĂ©nĂ©rer dans le cadre de la tĂąche de complĂ©tion dâimage (inpainting), oĂč les rĂ©gions non masquĂ©es doivent rester intactes tandis que le nouveau contenu est gĂ©nĂ©rĂ© pour la zone masquĂ©e.
Finetuning avec DreamBooth
Image provenant de la page du projet dreambooth basée sur le modÚle Imagen
DreamBooth est une technique permettant de finetuner un modĂšle texte-image afin de lui « apprendre » un nouveau concept, tel quâun objet ou un style spĂ©cifique. La technique a Ă©tĂ© dĂ©veloppĂ©e Ă lâorigine pour le modĂšle Imagen de Google, mais a Ă©tĂ© rapidement adaptĂ©e pour fonctionner pour Stable Diffusion. Les rĂ©sultats peuvent ĂȘtre extrĂȘmement impressionnants (si vous avez vu quelquâun avec une photo de profil IA sur les mĂ©dias sociaux rĂ©cemment, il y a de fortes chances quâelle provienne dâun service basĂ© sur Dreambooth), mais la technique est aussi sensible aux paramĂštres utilisĂ©s, alors consultez notre notebook et cet article de blog sur les diffĂ©rents paramĂštres dâentraĂźnement pour obtenir des conseils sur la façon de la faire fonctionner le mieux possible.
Notebooks
| Chapitre | Colab | Kaggle | Gradient | Studio Lab |
|---|---|---|---|---|
| Introduction Ă Stable Diffusion | ||||
| Plongée dans Stable Diffusion |
Le notebook Stable Diffusion Introduction est une courte introduction Ă Stable Diffusion avec la bibliothĂšque đ€ Diffusers, prĂ©sentant quelques exemples dâutilisation de base en utilisant des pipelines pour gĂ©nĂ©rer et modifier des images.
Enfin, le notebook et la vidĂ©o Stable Diffusion Deep Dive dĂ©composent chaque Ă©tape dâun pipeline de gĂ©nĂ©ration typique, en suggĂ©rant de nouvelles façons de modifier chaque Ă©tape pour un contrĂŽle crĂ©atif supplĂ©mentaire.
Project
LIEN VERS LâEVENT
Ressources complémentaires
Une liste non exhaustive de ressources (en anglais) Ă consulter :
- High-Resolution Image Synthesis with Latent Diffusion Models, le papier qui a introduit lâapproche derriĂšre Stable Diffusion
- CLIP apprend Ă relier le texte aux images et lâencodeur textuel est utilisĂ© pour transformer un prompt textuel en la riche reprĂ©sentation numĂ©rique utilisĂ©e par SD. Voir Ă©galement cet article sur OpenCLIP pour en savoir plus sur les rĂ©centes variantes de CLIP open-source (dont lâune est utilisĂ©e pour la version 2 de SD).
- GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models un papier précoce démontrant le conditionnement de texte et le CFG
Vous avez identifiĂ© dâautres ressources intĂ©ressantes ? Faites-le nous savoir et nous les ajouterons Ă cette liste.