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

SD example images
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 !

latent diffusion diagram
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.

text encoder diagram
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.

conditioning diagram

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.

CFG scale demo grid
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.

depth to image example
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

dreambooth diagram 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 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab
Plongée dans Stable Diffusion Open In Colab Kaggle Gradient Open In SageMaker Studio Lab

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 :

Vous avez identifiĂ© d’autres ressources intĂ©ressantes ? Faites-le nous savoir et nous les ajouterons Ă  cette liste.