Icône ComfyUI

Tutoriel: créer des images avec ComfyUI et Flux ou Stable Diffusion 3.5

"Génère moi une image d'aspirine dans un verre"

On s'est bien amusé avec Easy Diffusion et Stable-Diffusion 1.5 ! Mais maintenant, avec la sortie de Flux et de Stable Diffusion 3.5, il est temps de passer dans la cour des grands ! Ces deux familles de modèles sont infiniment supérieures à ce que l'on pouvait obtenir avec Stable Diffusion 1.5 et il serait vraiment trop dommage de s'en priver. Mais pour pouvoir les utiliser dans les meilleures conditions, nous allons changer de logiciel, quitter EasyDiffusion (qui n'est pas compatible) et apprendre à se servir de ComfyUI !

Alors oui, on sait. Si vous Googlez "ComfyUI", il est facile de prendre peur. Tout le monde prétend que ce logiciel est d'une complexité monstrueuse à utiliser et qu'il faut au moins être sorti major de promo à polytechnique pour s'en servir... Rassurez-vous, tout cela est très exagéré. ComfyUI est compliqué si vous voulez faire des choses compliquées avec. Pour commencer à s'amuser tout de suite et à générer des images avec Stable Diffusion 3.5 ou Flux, vous verrez que ça n'est en réalité pas si sorcier. Avec notre petit tuto, dans quelques minutes, vous serez déjà prêts à générer vos premières images.

 

Avant de commencer : Stable Diffusion 3.5, Flux.1 ou les deux ?

C'est vrai ça, quelle différence ?

Eh ben... pas mal de choses en fait. Stable Diffusion 3.5 et Flux ont un fonctionnement interne assez différent, vont interpréter vos prompts de manière assez différente et vont réagir différemment aux différents paramètres que nous verrons ci-dessous.

Précisons d'ailleurs : dans ce tuto, nous utiliserons Stable Diffusion 3.5 Large et Flux.1 Dev, qui sont à cette heure les deux modèles les plus gros et les plus puissants disponibles. Il existe des versions "allégées" (Stable Diffusion 3.5 Medium et Flux.1 Schnell), mais nous allons les laisser de côté, car qui peut le plus peut le moins. Ceci étant, ce que nous dirons de SD3.5 et Flux.1 dans leurs plus grosses versions s'applique généralement aussi à leurs versions allégées.

Commençons donc par établir les principaux points de différence entre SD3.5 et Flux :

Stable Diffusion 3.5 Large vs Flux.1. Dev
 Stable Diffusion 3.5Flux.1 Dev
Vitesse de générationMoyenneMoyenne à lente
Gestion de l'anatomie humaineMoyenne à médiocreBonne
Diversité de styles pris en chargeTrès variéeVariée
Adhésion au promptCorrecteCorrecte
Gestion du texte sur l'imageCorrecteCorrecte à bonne
Aisance avec le photoréalismeBonneTrès bonne
Possibilités en fine-tunage et gestion de LoRAsTrès fine-tunable. LoRAs fonctionnels et bien gérés.Peu fine-tunables. LoRAs fonctionnels.
VRAM nécessaire8Go8Go
ParamétrageTrès sensible, différents paramètres entraînent des résultats très différentsMoins sensible
Gestion des prompts négatifsOuiNon
Résolutions prises en charge1024x1024 ou nombre de pixels équivalent (1 megapixel), pas plus, pas moins (compatible 768p).De 0.1 à 2 Megapixels (de 320x320 à 1400x1400), compatible 1080p (1920x1080)

Au delà de ces considérations techniques, Stable Diffusion 3.5 et Flux.1 vont simplement avoir une interprétation différente de vos prompts, entraînant des résultats sensiblement différents. Dans certains cas, un modèle dominera nettement sur l'autre, tandis que dans d'autres cas, les deux modèles auront chacun des qualités propres sans que l'on puisse objectivement nommer un vainqueur.

Prenons un exemple avec les deux prompts suivants : 

A cute, anthropomorphic bobcat, wearing a kimono, waving hello in an alley of a theme park. The style is that of a hand-drawn anime or manga similar to the style of studios Ghibli animationfilms and the work of Hayao Miyazaki, Isao Takahata or other mangaka or japanese animators. It has that typical japanese kawaii vibe, with vivid colors. The cat is in SD style, with exagerated proportions (big head), and big expressive eyes.

Et

An anime-style picture of a dim-lit, messy 90s teenager bedroom, with an unmade bed, closed blinds, comics and video games on the floor, and a Super Nintendo hooked-up to a CRT TV Screen. The room is disorderly, reminiscent of a typical teenage bedroom. Various posters from movies and games are hanging on the walls. The TV is on and one can visibly see the title of a video game that reads 'GAME FOREVER' in big letters on it. The picture has warm colors and the room is seen is low light. Orange rays of the sun shine between the shut louvers of the  blinds.

Et voyons l'interprétation qu'en font les deux modèles, à paramètres strictement identiques en tous points (même seed, même guidance, même sampler, même scheduler, etc.) :

Comme vous le voyez, l'interprétation est assez différente (et entre nous soit dit, aucun des deux modèles ne génère une image vraiment satisfaisante sur le second exemple, les incohérences spatiales étant omniprésentes dans les deux cas). Et vous avez sans doute votre préférence, mais attention... sur un autre prompt, vous préférerez peut-être l'autre modèle. Si vous le pouvez, donc, nous vous encourageons à télécharger et essayer les deux. Et si vraiment vous deviez en choisir un... nous proposerons un comparatif dans un autre article, mais disons pour résumer que :

  • Si vous voulez des résultats satisfaisants tout de suite et facilement, optez plutôt pour Flux
  • Si vous voulez un modèle très paramétrable et qui permettra à terme de faire plus de choses avec beaucoup de souplesse, quitte à ce que vos premiers résultats dans l'immédiat soient un cran en dessous, préférez Stable Diffusion 3.5

Par ailleurs :

  • Si vous comptez générer beaucoup d'image réalistes et/ou comportant des humains, préférez Flux
  • Si vous comptez générer des paysages et/ou des images de style plus fantaisiste, préférez Stable Diffusion 3.5

 

Cette question étant soldée, il est temps de s'y mettre !

 

Préparatifs de guerre

Premier avertissement : pour faire fonctionner correctement ces modèles avec les techniques abordées ici, vous aurez besoin d'un GPU nvidia doté d'au moins 8Go de VRAM. Il est possible de faire tourner ces modèles avec moins de VRAM et/ou avec une autre marque de GPU, mais cela ajoute une couche de complexité et cette situation ne sera pas abordée dans ce tuto. Il est également possible de faire effectuer les calculs par le CPU, mais la lenteur extrême de ce procédé devrait venir à bout même des plus patients d'entre vous. Nous déconseillons donc cette solution.

 

Installation et premier lancement de ComfyUI

Rien de bien compliqué. Autant il fut un temps où l'installation de ComfyUI était un poil velue, autant depuis la sortie du logiciel pour Windows et macOS, c'est un jeu d'enfant. Téléchargez ComfyUI (lien vers la version mac également en fin d'article), et lancez l'installation comme vous installeriez n'importe quel logiciel..

La seule chose à laquelle vous devez faire attention, c'est lorsqu'il vous demande où placer le répertoire qui contiendra vos fichiers personnalisés : la génération d'image, ça implique de télécharger des modèles assez volumineux. Indiquez-lui une partition sur laquelle vous avez de la place, beaucoup de place. Selon ce que vous faites avec ComfyUI, vous aurez possiblement besoin de plusieurs dizaines de giga-octets d'espace. Évitez peut-être de tout installer dans C: si vous avez un espace limité sur cette partition.

Une fois l'installation terminée, le logiciel s'ouvre avec l'interface de ComfyUI. Le logiciel est installé, mais à ce stade, vous ne pouvez rien faire, puisque vous n'avez pas encore de modèles à exécuter. L'interface ne vous paraît pas claire ? Pas d'inquiétude, on y reviendra après.

 

Facultatif : installation de Crystools Save Image Extended.

Ça n'était pas le cas au moment où nous avons commencé à écrire ce tuto, mais désormais, ComfyUI est installé par défaut avec un "Manager". Et ce manager est bien pratique ! Car il permet notamment d'installer tout un tas de trucs et de machins en un seul clic. Alors, profitons-en pour installer deux nœuds personnalisés susceptibles de nous faciliter un peu la vie. Crystools, et surtout Save Images Extended. Pour ce faire, commencez par quitter et redémarrer ComfyUI.

Dans le menu en haut de l'interface, cliquez sur le bouton bleu intitulé Manager. Puis, dans le menu contextuel qui s'ouvre alors, cliquez sur Custom Nodes Manager.

Vous accédez alors à une liste de nœuds potentiels à installer. Comme un mini app-store, mais rassurez-vous, ici, tout est gratuit. Vous pourrez télécharger ici tout un tas de nœuds personnalisés plus ou moins utiles.

 Nous vous recommandons d'installer Crystools, qui apporte diverses petites améliorations appréciables rendant ComfyUI plus agréable, et Save Image Extended, qui vous permettra notamment de définir très précisément les noms de fichiers et répertoires de vos images, très utile notamment lorsque vous voulez comparer plusieurs paramètres sur un même prompt.

Cherchez ces noms dans la liste et cliquez tout simplement sur Install. Une fois l'installation terminée, redémarrez ComfyUI pour terminer l'installation (ou attendez d'avoir tout installé pour redémarrer, puisqu'on n'a pas tout à fait fini d'installer des contenus).

 

Installation des modèles Stable Diffusion 3.5 Large et Flux.1 Dev.

Il existe de nombreuses versions des modèles Stable Diffusion 3.5 et Flux.1. Nous allons installer les versions qui offrent le meilleur compromis efficacité/simplicité/exigences hardware. Celles-ci sont fournies directement par le créateur de ComfyUI, pour notre plus grand plaisir.

Pour Stable Diffusion, nous vous conseillons le fichier sd3.5_large_fp8_scaled.safetensors que vous pouvez télécharger sur Hugging Face. Ce n'est pas forcément la version la plus optimisée qui soit, mais elle fonctionne bien, ne nécessite pas l'installation de plug-ins supplémentaires ni aucun autre fichier supplémentaire.

Pour Flux.1 Dev, nous vous conseillons flux1-dev-fp8.safetensors également disponible sur le Hugging Face de Comfy.

Ces modèles sont à télécharger et à installer dans votre répertoire personnalisé ComfyUI, dans le sous-répertoire ComfyUI\models\checkpoints

Par exemple, si au moment de l'installation vous avez paramétré le dossier personnalisé dans le répertoire racine de C:, ce sera dans 
C:\ComfyUI\models\checkpoints

Un petit redémarrage de ComfyUI pour qu'il prenne en compte l'installation des modèles, et on est bons !

 

Facultatif : installation de LoRAs

Nous avions déjà abordé les LoRAs du temps de Stable Diffusion 1.5. En résumé, il s'agit de petits bouts de modèles qui vont se greffer sur le modèle principal pour modifier son comportement et sa perception des choses. Les LoRAs permettent, à moindre coût puisque les plus petits font moins de 20Mo, d'apprendre à un modèle à faire des choses qu'il ne savait pas faire ou de changer de style. Vous pouvez ainsi avoir un LoRA spécialisé "pixel art" qui donnera à toutes vos générations une esthétique Pixel Art, ou bien un LoRA Ghibli, ou bien un LoRA "expressions de visage" qui lui permettra de mieux réagir à des prompts contenant des mots relatifs aux expressions, ou encore un LoRA spécialisé dans la reproduction de tel ou tel personnage réel ou fictif.

Vous pouvez télécharger des LoRAs sur Civitai, il faudra les placer dans le répertoire ComfyUI\models\loras.

 

ComfyUI et le principe des "workflows".

La grande particularité de ComfyUI, c'est qu'il n'a pas d'interface et de menus fixes. C'est vous qui ajoutez et reliez entre eux les différents nœuds nécessaires à l'exécution de la tâche que vous voulez lui confier (dans notre cas "Générer une image avec Stable Diffusion ou Flux"). On appelle un ensemble de nœuds reliés entre eux un Workflow.

La mauvaise nouvelle, c'est que créer un workflow de zéro demande des connaissances assez pointues dans le fonctionnement des modèles.

La bonne nouvelle, c'est que vous n'avez absolument pas besoin de créer un workflow de zéro. Vous pouvez en recopier un ou même, le télécharger et l'ouvrir depuis ComfyUI !

Voici un Workflow simple, adapté à la fois à SD3.5 et à Flux. Ça a l'air compliqué ? Juré, ça ne l'est pas tant que ça, décomposons-le ensemble.

À gauche, nous avons la section "Modèles". Celle-ci commence par "Load Checkpoint". Ce nœud charge le modèle principal que nous utilisons (par exemple Flux.1 Dev). Vous pouvez sélectionner le modèle de votre choix parmi ceux que vous avez installés grâce à la liste déroulante.

Ce nœud est relié à un premier nœud "Load LoRA" qui lui-même est relié à un second "Load LoRA". Ceci permet d'utiliser jusqu'à deux LoRAs enchaînés. Il serait possible, dans l'absolu, d'en enchaîner comme ça une infinité (sous réserve que votre RAM et votre VRAM tiennent la charge). Ceci étant dit, si vous souhaitez plus de deux LoRAs, vous avez tout intérêt à faire un petit tour dans le Manager et à télécharger le nœud "LoRA Loader Stack", qui permet à partir d'un seul nœud d'en charger quatre d'un coup.

Attention : les LoRA ne sont compatibles qu'avec un seul modèle principal. Vous ne pouvez pas utiliser un LoRA Flux avec Stable Diffusion et vice-versa. Certains LoRAs disponibles sur Civitai existent en deux versions, l'une pour SD et l'autre pour Flux. Faites attention à laquelle vous téléchargez et, si vous prenez les deux, pensez à leur donner des noms reconnaissables pour ne pas vous perdre le moment venu.

Si vous n'avez pas installé de LoRA pour votre modèle, ou que vous ne souhaitez pas en utiliser, vous devrez désactiver ces nœuds en faisant un clic droit dessus puis en cliquant sur Bypass.

Ensuite, nous avons la section CLIP. Celle-ci concerne la partie du modèle qui va interpréter le texte, donc notre prompt. Nous en avons deux : un "Positive prompt" et un "Negative prompt". Dans le Positive prompt, nous saisissons ce que nous voulons comme image. Et dans le "Negative prompt", tout ce qu'on ne veut pas. Nous y reviendrons plus tard.

Nous avons ensuite la section Configuration. Bon, ça se complique un peu, mais nous relions ici nos nœuds de prompt à des nœuds qui servent à configurer la manière dont le modèle va générer l'image. Nous allons configurer des paramètres tels que le niveau de guidance (c'est-à-dire à quel point le modèle doit essayer d'adhérer parfaitement au prompt), le nombre d'étapes d'inférence, la résolution, etc.

Tout part ensuite dans VAE Decode, qui va finir le travail pour avoir une image exploitable. Celui-ci est relié à notre  dernière zone, Décodage / Enregistrement, dans laquelle le nœud Save Image Extended va enregistrer l'image dans le répertoire de notre choix, avec le nom de fichier de notre choix, au format de notre choix.

Vous n'avez pas envie de refaire ce workflow vous-même ? Pas de problème ! Nous vous proposons de les télécharger directement !

Télécharger le Workflow présenté ci-dessus (avec le nœud "Save Image Extended").

Télécharger une version simplifiée (sans le nœud "Save Image Extended", si vous avez sauté les étapes facultatives tout à l'heure).

Il vous suffit ensuite, dans le menu en haut, de cliquer sur Workflow > Open, de sélectionner le workflow téléchargé comme vous ouvreriez n'importe quel document dans n'importe quel logiciel, et le tour est joué !

Petite précision toutefois : nous avons désactivé par défaut les deux nœuds "LoRA" car, si vous n'en utilisez pas, vous recevrez un message d'erreur. Si vous voulez utiliser des LoRA, faites un clic droit sur l'un ou les deux nœuds "Load LoRA", cliquez sur Bypass dans le menu contextuel, puis sélectionnez votre LoRA dans la liste déroulante.

Tout est installé, configuré, maintenant comment ça marche ?

Voyons ensemble, nœud par nœud, ce que nous pouvons faire dans ce workflow.

Modèles

Commencez par sélectionner un modèle principal (dit "checkpoint"), Flux ou SD.

Sélectionnez un ou plusieurs LoRA ou désactivez le nœud "LoRA Stacker" si vous ne voulez en utiliser aucun.. Si vous n'êtes toujours pas au clair avec ce qu'est un LoRA, reprenons notre comparatif issu de notre ancien article sur Stable Diffusion 1.5. Les images datent un peu, mais le principe reste valide :

Même image avec et sans LoRA

Vous avez ici la même image avec le même prompt, le même modèle principal et les mêmes paramètres, tout identique, sauf qu'en bas, nous avons chargé un LoRA spécialisé dans le style "ghibli". Notre image s'en trouve sensiblement transformée dans son style graphique. Gageons que nous aurions pu charger un LoRA spécialisé "Rintintin" et plutôt que changer le style artistique de l'ensemble de l'image, il aurait surtout singulièrement modifié la race du chien.

À quoi correspondent les paramètres "strength_model" et "strength_clip" ?

La différence entre ces deux paramètres est tellement subtile que, dans les autres logiciels que ComfyUI, les deux paramètres sont fusionnés. Sur le principe, strength_model va influencer plutôt la partie "génération d'image" du modèle (le modèle dit "unet" chargé de transformer le bruit aléatoire en une image définie) tandis que strength_clip va plutôt agir sur la partie "compréhension du prompt" du modèle (le modèle CLIP, chargé de transformer votre prompt textuel en données informatiques exploitables par l'IA). 

En pratique, nous vous conseillons de modifier les deux paramètres à la fois en leur attribuant des valeurs proches. Il est en principe possible d'obtenir des résultats différents, et donc potentiellement intéressants, en jouant sur la différence entre les deux paramètres, mais la chose est tellement peu contrôlable cela ne vaut pas les maux de tête impliqués par ce processus.

Contentez-vous donc de retenir que plus vous augmentez ces valeurs, plus le LoRA prend de l'importance dans la génération. Mais attention : une valeur trop élevée peut aussi mal tourner. Il faudra expérimenter car chaque LoRA a une plage de valeurs efficace qui lui est propre. Pour certains modèles, il faudra choisir une valeur située entre 0.0 et 1.0, tandis que pour d'autres, vous pourrez montez jusqu'à +2.0, +3.0 voire au-delà. Et il existe même des LoRAs qui acceptent des valeurs négatives !

Prompt positif

Vient ensuite le moment d'entrer votre prompt. L'un des grands progrès de ces modèles modernes par rapport au vieux Stable Diffusion 1.5, c'est qu'ils sont beaucoup plus à l'aise avec le langage naturel. Plus besoin de saisir une liste interminable de mots-clés. Contentez-vous de décrire finement ce que vous voulez. 

Si vous le pouvez, nous vous conseillons fortement de parler au modèle en anglais. Bien que les deux modèles comprennent correctement le français et puissent générer une image satisfaisante en réponse à un prompt rédigé en français, vous obtiendrez généralement des résultats bien meilleurs et plus précis, avec un bien meilleur respect du prompt, si vous vous exprimez en anglais.

Pensez à décrire dans votre prompt à la fois le contenu, mais aussi le style voulu. Si vous voulez quelque chose qui s'apparente à une véritable photo, dites-le-lui, et n'hésitez pas même à préciser quel type d'appareil photo il doit imiter, voire même quelle marque et quel modèle ! Si vous ne vous y connaissez pas plus que ça en appareils photos, vous pouvez lui suggérer de générer une photo qui semble avoir été prise par un iPhone récent, cela permettra de lui suggérer un style proche des photos de la vie de tous les jours.

Si vous voulez de la peinture, ou un style 3D, dites-le-lui ! Si vous voulez que la photo paraisse spontanée, ou au contraire issue d'un shooting, dites-le-lui aussi. N'hésitez pas à être précis, descriptif.

Autre progrès notable de ces nouveaux modèles : ils sont capables, dans une certaine mesure, d'ajouter un peu de texte à l'image générée. Vous pouvez ainsi lui faire générer un logo, ou bien lui demander qu'il soit écrit quelques mots sur le t-shirt de votre personnage, etc.

Voici un exemple de prompt :

A photo of a belgian stemmed glass of beer filled to the brim, with a small bottle on the size whose label reads 'everydAI's fine IPA'. The beer is a pale yellow with white foam. The glass is a "chalice" shape. The photo looks like it has been taken in a soft-lit environment, with warm yellow dim light. The photo seems to be taken with a good-quality smartphone such as an iPhone camera.

Prompt négatif :

Si vous utilisez Flux, vous pouvez ignorer ce nœud. Laissez-le vide. Flux ne gère tout simplement pas les prompts négatifs. C'est une limitation inhérente au modèle donc pas la peine d'essayer de l'empêcher de générer telle ou telle chose de cette manière, ça ne marchera pas.

Si vous utilisez SD3.5 en revanche, alors vous pouvez entrer dans cette section tout ce que vous ne souhaitez pas voir, aussi bien sur le fond que sur la forme, généralement sous forme de mots-clés.

Vous voulez générer une photo de rue mais vous ne voulez PAS de voiture visible ? Vous pouvez saisir "car" dans le prompt négatif. Vous voulez éviter les persos à sept doigts par mains (un problème récurrent de stable-diffusion, toujours pas vraiment corrigé) ? Vous pouvez ajouter "extra fingers" à la liste. Malgré vos demandes récurrentes d'un style "dessin animé", le modèle s'échine à vous produire des images en 3D façon Pixart ? Ajoutez des termes comme "3D, CGI" au prompt négatif.

Prenons un exemple : nous avons donné le prompt positif suivant à Stable Diffusion :

A 3D CGI picture of a young boy playing with his toys, in the style of a Disney Pixar movie. The boy is roughly 5 years old, blond-haired, blue-eyed, with big round glasses and looks happy. He is wearing pajamas and is playing with a small toy car. The toy car is branded with the text 'FAST' on the side. The style of the image is that of a Pixar movie such as Coco or Toy Story.

Problème, nous trouvions que l'image générée était un peu trop réaliste et pas assez Pixar. De plus, il y avait un problème sur les doigts de l'enfant. En prompt négatif, nous avons donc ajouté :

realistic, photorealistic, extra fingers, body horror

Et voici le résultat :

Comme vous pouvez le voir (à droite), le prompt négatif nous a efficacement débarrassé du photoréalisme de sa proposition de départ (à gauche). De plus, il y a effectivement du mieux sur la main droite, même si ce n'est pas encore parfait. En revanche, il a quelque peu abimé la voiture. Il faudra corriger cela soit en adaptant encore un peu les prompts, soit via les options du KSampler.

Malheureusement, Flux ne prend pas en charge les prompts négatifs, mais en pratique, il en a nettement moins besoin aussi, son respect des prompts positifs étant généralement supérieur (par exemple, avec ce même prompt, il nous a systématiquement généré des images de type Pixar, et pas des images photoréalistes).

 

KSampler, Kézaco?

Si la mitochondrie est la centrale énergétique de la cellule, j'ai envie de dire que le KSampler est la cellule énergétique de nos modèles. C'est en jouant sur ces paramètres que vous allez guider le modèle dans son interprétation du prompt. Voyons points par points ces différentes options :

Seed : la graine est une valeur aléatoire qui va entraîner une génération différente par le modèle. Chaque changement de graine, même d'une seule unité, va entraîner une génération d'image totalement nouvelle par le modèle.

Control after generate : définit la manière dont la seed sera modifiée ou pas après chaque génération. Si vous voulez, par exemple, tester l'effet d'un paramètre, vous avez intérêt à laisser cette valeur à "fixed" pour conserver la même graine et ainsi pouvoir tester votre nouveau paramètre "toutes choses égales par ailleurs". Si vous voulez générer un maximum d'images toutes différentes les unes des autres, alors "increment", "decrement" ou "randomize" vous permettra de changer de graine après chaque génération d'image.

Steps : c'est le nombre d'étapes d'inférence. Le nombre idéal varie en fonction du modèle choisi, des autres paramètres, de la présence ou non d'un prompt négatif, du niveau de détail dont vous avez besoin. En principe, plus votre nombre d'étapes d'inférence est élevé, plus l'image sera fine, cohérente, aboutie. Un nombre faible d'étapes entraîne une image brouillonne, floue, pleine d'artefacts ou d'incohérences logiques. Mais attention : in medio stat virtus. Après un certain nombre d'étapes d'inférence, l'image ne progresse plus vraiment, voire elle peut commencer à régresser et faire apparaître de nouvelles erreurs. De plus, la durée de génération d'une image augmente fortement avec le nombre d'étapes. Une image à 20 étapes prendra grosso-modo 2x plus de temps à générer qu'une image à 10 étapes, mais 2x moins longtemps qu'une image à 40 étapes.

À 5 étapes, l'image ne ressemble pas à grand chose. À 10, le prompt n'est pas encore respecté et le pyjama de l'enfant se confond avec la literie. L'image est incohérente et inexploitable. À 20 étapes, l'image devient très correcte à première vue, mais à y regarder de plus près, le garçon a trois jambes. Ce problème disparaît à partir de 30 étapes, bien que l'anatomie générale reste douteuse, les jambes étant tordues bizarrement. Au-delà, on ne constate plus vraiment de progrès (des artefacts apparaissent même à 50 étapes). Quant au problème de polydactylie, ils restent constants sur cette seed quel que soit le nombre d'étapes. Il semble donc que l'on obtienne des progrès majeurs jusqu'à 20 étapes, des progrès subtils jusqu'à 30, et guère au-delà. Mais attention : le nombre d'étapes idéal dépend du modèle, du prompt, et des nombreux autres paramètres.

Cfg (pour Stable Diffusion seulement) : définit le niveau d'adhésion au prompt. Plus la valeur est proche de 1, moins Stable Diffusion se concentre sur le fait de respecter strictement vos instructions et plus il devient créatif. Vous pouvez donc augmenter la valeur pour qu'il respecte mieux vos ordres mais attention : il faudra souvent augmenter le nombre d'étapes d'inférence pour obtenir un résultat pas trop vilain. Et là encore il faudra savoir rester raisonnable, au-delà d'un certain niveau, l'image commencera à se dégrader, surtout si le modèle a du mal à comprendre votre prompt ou que celui-ci est trop vague. Expérimentez pour voir quelle valeur vous convient, mais globalement vous pouvez considérer qu'entre 3.5 et 7 est une plage de valeurs raisonnables. En deça ou au-delà, c'est à vos risques et périls, même si vous pourrez parfois obtenir des résultats intéressants. Regardez plutôt :

On voit bien qu'en-dessous de 3.0, le style n'est pas vraiment respecté (surtout à 1.0 où le style est vraiment photoréaliste) et d'importantes incohérences existent sur l'image. 
À 3.0, le style commence à s'affiner et les objets à être clairement définis, mais l'image reste assez incohérente, notamment du côté du bras de l'enfant. 
À 5.0, le style Pixar est vraiment respecté, l'image est globalement cohérente (à part les doigts, toujours un problème), le texte sur la voiture est conforme à notre demande.
À 7.0, on commence déjà à perdre un peu en qualité : le texte n'est plus correct sur le côté de la voiture, et le texte sur l'aileron n'est pas vraiment cohérent. Le problème peut toutefois probablement être corrigé en augmentant le nombre d'étapes d'inférence.
À 10.0, le texte sur la voiture revient mais l'image commence à être excessivement saturée : l'adhérence au prompt a cessé d'augmenter depuis longtemps et la qualité commence à se dégrader significativement.
À 15.0, la saturation s'intensifie, on perd beaucoup de détails, l'image devient moche et le style Pixar commence à disparaître pour un éclairage plus photoréaliste, notamment sur le visage.
À 25.0, comment dire... c'est rigolo ! Mais c'est pas franchement ce qu'on avait demandé...

ATTENTION : du fait de la nature même dont Flux fonctionne, la modification de la valeur CFG n'est pas adaptée à Flux. Pour Flux, la valeur doit rester à 1.0 ou proche de 1.0 (vous pouvez expérimenter des valeurs telles que 1.1 ou 1.2 mais guère au-delà, au risque de ruiner totalement l'image). Pour Flux, le niveau de respect du prompt ne se définit pas dans le KSampler mais dans le nœud Flux Guidance, dont nous parlerons plus bas.

Sampler : reprenons ce que nous disions dans le tutoriel consacré à EasyDiffusion : les différents samplers vont interpréter légèrement différent vos prompts et entraîner une génération différente même avec une même seed, un même prompt et un même modèle. Ils ont pour rôle de choisir la façon dont l'image sera "débruitée" pour devenir progressivement une image cohérente.  En très gros, si le modèle va déterminer la composition de l'image, le sampler va déterminer le contenu des objets.

Chacun a ses avantages et ses inconvénients, mais certains ne sont pas compatibles avec Stable Diffusion 3.5 ou avec Flux. Certains sont plus rapides que d'autres, certains nécessitent plus d'étapes d'inférence que d'autres... vous êtes libre d'expérimenter, notamment si vous générez une image qui vous plaît mais que vous trouvez qu'il y a quelques détails qui vous gênent dedans : régénérer l'image avec la même seed mais en changeant de sampler peut être une solution.

Cela donne une bonne idée de ce que nous disions plus haut : la composition ne change pas vraiment : un sol de type tapis orange, avec une section bleue là où l'enfant est situé. Dessus, une petite voiture avec une vue isométrique, et le garçon perpendiculaire à celle-ci. Un ou deux petits objets sont devant la voiture. En arrière plan, un canapé. Mais selon les samplers, la voiture va changer significativement de forme et de couleur, le garçon va changer légèrement de pose, de traits de visage, de vêtements, et l'objet devant la voiture sera tantôt une petite voiture, tantôt un jouet de type lego. Le canapé va également changer d'aspect.

Mais alors, quel sampler choisir ? Globalement, "euler" est un bon sampler, polyvalent, offrant un excellent compromis entre tous les différents aspects influencés par le sampler. Ce n'est pas pour rien qu'il est placé en haut de la liste. Mais nous avons aussi obtenu des résultats intéressants avec DEIS, DDIM, et uni_pc_bh2. Nous avons aussi obtenu des résultats satisfaisants avec Heunpp2 mais celui-là est nettement plus lent que les autres. Par défaut, rester sur Euler reste une bonne idée. Vous remarquerez aussi une image de particulièrement mauvaise qualité avec le sampler ddpm : voilà ce qui arrive quand on utilise un sampler incompatible avec le modèle : une image hideuse, ou dans certains cas pas d'image du tout.

Scheduler : le scheduler va également influencer la manière dont le modèle transforme le bruit de départ en une image finalisée et détaillée. La différence entre deux schedulers est souvent plus subtile qu'entre deux samplers, mais pas toujours. Et pour ne rien arranger, certains schedulers ne sont compatibles qu'avec certains samplers. Par exemple, le scheduler linear_quadratic est compatible avec Euler, mais pas avec Uni_PC. Là encore, il faudra expérimenter. Il est souvent considéré que le scheduler "beta" est un bon choix par défaut, mais cela est assez variable, surtout sur les détails fins comme le texte. Regardons ensemble les résultats de plusieurs schedulers :

Sur Stable Diffusion, on constate, et cela est intéressant, trois familles de schedulers : ddim_uniform, sgm_uniform, normal et simple (ce dernier non montré ici) donnent des résultats extrêmement similaires entre eux et forment une première famille. 
Beta et linear_quadratic forment une famille à part, donnant des résultats assez similaires entre eux, mais différents de la famille précédente.
Quant à Karras et Exponential (ce dernier non montré ici), ils ne fonctionnent pas du tout avec Stable-Diffusion 3.5. 

Sous Flux en revanche, la situation est un peu différente :

D'abord, on ne constate pas de différence aussi marquée entre les schedulers, pas de "grandes familles" de modèle ici. Ensuite, Karras (et Exponential) forment une image avec la plupart des samplers (ici Euler), mais de mauvaise qualité avec un nombre normal d'étapes d'inférence. Il faut augmenter significativement le nombre d'étapes d'inférence pour avoir une image à peu près nette et pas trop creepy. De plus, l'image est très différente de ce qui est obtenu avec les autres schedulers. Voici par exemple la même image, avec tous les paramètres à l'identique, Karras en scheduler, et 75 étapes d'inférence :

L'image n'est pas très exploitable ici, car l'on veut quelque chose d'assez précis, mais les résultats offerts par Karras et Exponential ne sont pas toujours dénués d'intérêt. Ils sont surprenants, très différents de ce qu'on obtient avec les schedulers normaux, nettement plus abstraits ou fantastiques, avec une interprétation, un style et une composition extrêmement différent des autres schedulers, au point qu'on a peine à croire que le résultat vient du même modèle. Mais pas toujours inintéressants pour qui veut une interprétation un peu plus stylisée de son prompt.

Denoise : Dans le cas qui nous intéresse, à savoir le txt-to-img, c'est-à-dire la génération d'une image à partir d'un prompt, le niveau de Denoise doit rester à 1 ou proche de 1. Cette valeur doit être réduite lorsque l'on veut faire du img-to-img, c'est-à-dire demander à une IA de modifier une image existante, ou de l'inpainting, c'est-à-dire générer un bout d'image dans une image en tenant compte de ce qu'il y a autour. Plus le niveau de denoising est proche de 1, moins l'image originale est prise en compte et conservée. Plus elle est proche de 0, plus l'IA respectera le matériau original. Mais cela est un peu hors de la portée de ce tuto.

Voilà donc qui conclut notre (longue) session sur le KSampler et sa configuration. Mais nous n'avons pas fini !

 

Flux Guidance - Pour Flux uniquement

Comme nous l'avons vu dans la section consacrée au nœud KSampler, lorsque vous utilisez Flux, il faut éviter de modifier le paramètre CFG avec Flux, qui n'est pas compatible. Heureusement, il existe un équivalent pour Flux avec la même utilité : plus vous augmentez la valeur, plus l'adhésion au prompt est élevée (et moins le modèle est créatif), mais plus vous risquez de générer des horreurs si le modèle ne comprend pas ce que vous voulez.

C'est exactement à cela que sert le nœud FluxGuidance et son paramètre unique, Guidance. Si, en interne, il fonctionne de façon tout à fait différente pour assurer la compatibilité avec Flux, d'un point de vue utilisateur, il s'utilise selon le même principe. Avec des valeurs un petit peu différentes de Stable Diffusion toutefois. 

En effet, là où Stable Diffusion commençait à s'effondrer avec un CFG à 10 (ou 15 en étant gentil), chez Flux, même un CFG à 50 ne pose pas forcément de souci. En fait, en augmentant un peu le nombre d'étapes d'inférence, on obtient des résultats satisfaisants jusqu'à 65 de guidance (sans que cela n'apporte grand chose non plus). Puis, c'est l'écran noir. Pas de dégradation progressive de l'image : on passe de "ça marche" à "plus rien".

Globalement, Flux est beaucoup plus tolérant dans sa plage de guidance acceptable, mais en contrepartie celle-ci a aussi nettement moins d'effet. Du reste, il semble que son optimum soit sur un taux de guidance un peu plus élevé que Stable Diffusion : entre 7 et 10 pour Flux contre entre 3 et 5 pour SD. Mais comme toujours, ce sera à vous d'expérimenter et cela pourra dépendre de votre prompt et de vos autres réglages (nombre d'étapes, sampler, scheduler...).

 

EmptySD3LatentImage

Ce nœud, en réalité compatible avec SD3.5 comme avec Flux, permet en substance de créer le "canvas" sur lequel va travailler le modèle. C'est ici que vous choisirez, en premier lieu, la taille de l'image. Plus l'image est grande, plus la génération prendra du temps. De plus, vous aurez probablement besoin de plus d'étapes d'inférence pour arriver à un résultat acceptable. Ne soyez pas trop gourmand, d'autant que votre machine pourrait ne pas suivre, quitte à upscaler après coup.

Mais attention à ne pas viser trop petit non plus, les modèles risquent de ne pas aimer : en particulier, comme précisé en début de tuto, Stable Diffusion 3.5 n'est pas à l'aise avec du 512x512. Il est conçu pour fonctionner sur des images d'1 Megapixel. Optez donc plutôt pour du 1024x1024 pour une image carrée. Ou n'importe quel multiple de 8 donnant un résultat proche d'un million de pixels. Par exemple, pour une image en 16/9e, vous pouvez opter pour du 720p (1280x720 pour un total de 921 600 pixels) ou du 768p (1366x768 pour 1 049 088 pixels).

Flux est beaucoup tolérant de ce point de vue : toutes les résolutions de 0.1 à 2 Megapixels lui conviennent. Soit de 320x320 à 1408x1408 pour une image carrée. En 16/9e, vous pouvez lui demander du 1080p (1920x1080 soit 2 073 600 pixels) sans que cela ne pose de problème majeur, si votre machine arrive à suivre et que vous lui donnez suffisamment d'étapes d'inférence. C'est l'un des avantages de Flux par rapport à SD 3.5.

Dernier paramètre de ce nœud : Batch Size : il permet tout simplement de générer plusieurs images en parallèle. Mais attention, cela va influencer le résultat même à seed égale. Définissez un batch size de 1, vous obtiendrez une certaine image. Définissez, toutes choses égales par ailleurs, un batch size de 4, et vous ne retrouvez l'originale dans aucune des 4.

Par ailleurs, là encore, le batch size maximum envisageable sera limité par les capacités techniques de votre bécane. Plus vous demandez d'image en parallèle, plus la consommation de RAM et surtout de VRAM sera élevée, au risque de finir sur une "Out of Memory Error".

Un avantage de poids toutefois à un batch size supérieur à 1 : si vous avez suffisamment de VRAM (c'est à dire, plus de 8Go), la génération pourra s'en trouver plus ou moins sensiblement accélérée. C'est à dire que lancer 1 tâche avec un batch size de 3 prendra potentiellement moins de temps que 3 tâches avec un batch size de 1.

 

Facultatif : paramétrer le nœud Save Image Extended

Si vous avez installé Save Image Extended comme proposé plus haut, autant en profiter pour le configurer correctement de manière à en profiter au mieux.

filename_prefix : ce sera le début de tous les noms de fichiers générés. Vous y mettrez typiquement le nom de votre "projet" c'est à dire ce que vous essayez de générer. Le but est que vous puissiez le retrouver facilement par la suite. Soyez donc descriptif.

Case sans nom, en dessous : Puis, en dessous, vous définissez les autres caractéristiques du nom de fichier. Vous pouvez entrer ici toutes sortes de données sur l'image qui vous permettront de repérer au premier coup d'œil de quelle version exacte de l'image il s'agit. Par exemple, vous pouvez lui indiquer ici d'ajouter au nom de fichier le nom du modèle, du sampler, du scheduler, de la seed, etc. Et ce automatiquement. Vous avez même des paramètres pour la date et l'heure.

Mettons que vous avez choisi comme préfixe "chaton" et comme paramètres "sampler_name, scheduler, steps, seed, %F %H-%M-%S".

Il vous génèrera un fichier dont le nom ressemblera à ceci : chaton-euler-beta-30-172721640246405-2024-11-30 14-30-25.jpg

Vous avez donc votre "chaton", votre sampler, scheduler, le nombre d'étapes, la seed, la date et l'heure de génération dans le fichier. Vous pouvez ajouter n'importe quel autre paramètre de votre workflow tel que la valeur cfg, la guidance, etc. L'idée est que, si vous générez de nombreuses images avec des paramètres légèrement différents, vous trouviez rapidement laquelle est laquelle.

Notez qu'en tout état de cause, Save Images Extended enregistre la totalité des paramètres de votre workflow dans les données EXIF de l'image. Mais c'est moins immédiatement lisible qu'un nom de fichier bien choisi.

foldername_prefix et case sans nom en dessous : Même principe, mais pour le nom du sous-dossier dans lequel sera sauvegardée l'image.

Delimiter : Indique le caractère qui sera utilisé pour séparer les différents paramètres dans le nom de fichier. Par défaut c'est un tiret, mais vous pouvez le remplacer par un underscore, une virgule ou encore un point.

save_job_data : Si vous activez cette option, ComfyUI sauvegardera les données de votre workflow dans un fichier texte. Vous pouvez définir le niveau de détail de l'enregistrement. Cette option n'est pas des plus pratiques, et nous préférons utiliser l'option save_metadata située peu après, qui permet de tout enregistrer dans les données EXIF de l'image.

job_data_per_image : permet de choisir entre créer un fichier texte distinct par image, ou tout enregistrer dans un seul fichier texte, si vous avez activé l'option précédente.

job_custom_text : permet d'ajouter aux données un texte de votre choix.

save_metadata : permet de choisir d'enregistrer (true) ou non (false) les données de votre workflow dans les métadonnées de l'image (EXIF ou équivalent dans les autres format de fichier). Compatible avec tous les formats de fichier sauf .bmp. Notez que si vous choisissez d'activer cette option et que vous enregistrez votre image en .png, il suffira ensuite de glisser l'image dans l'interface de ComfyUI pour charger automatiquement le workflow correspondant. Pas mal, non ?

counter_digits : vous remarquerez que chaque fichier généré commence ou termine par un numéro, qui augmente pour chaque nouvelle image générée. Ce paramètre permet tout simplement de choisir le nombre de chiffre que doit contenir ce numéro.

counter_position : permet de choisir si ce numéro doit être placé au début ou à la fin du nom de fichier.

one_counter_per_folder : permet de choisir si le numéro de fichier et son incrémentation doit être spécifique à chaque dossier, ou si vous voulez utiliser un seul compteur pour toutes vos créations, quel que soit le dossier de sauvegarde.

image_preview : permet d'activer ou de désactiver l'affichage d'un aperçu de l'image générée.

output_ext : permet de choisir le format de fichier de l'image (.png, .jpg, .webp, etc.)

quality : permet de choisir la qualité de l'image, lorsque cela a du sens (par exemple, la qualité d'un jpeg, mais un png est par nature de qualité parfaite puisque le format PNG est un format lossless).

named_keys : indique les clés correspondant aux valeurs utilisées dans les noms de fichiers/répertoires. Reprenons notre exemple de tout à l'heure : si vous activez cette option, votre fichier ne s'appellera plus chaton-euler-beta-30-172721640246405-2024-11-30 14-30-25.jpg mais chaton-sampler=euler-scheduler=beta-steps=30-seed=172721640246405-2024-11-30 14-30-25.jpg. Plus lisible, mais aussi vachement plus long.

 

Y a plus qu'à !

Vous avez tout configuré, vous avez saisi votre prompt, tout est prêt ? Alors vous n'avez plus qu'à cliquer sur le bouton "Queue".

ComfyUI lance immédiatement le modèle que vous avez sélectionné et celui-ci se met au travail. Quelques secondes à quelques minutes plus tard (selon la puissance de votre matériel), une première image apparaît dans l'interface.

Cette image a également été enregistrée sur votre disque dur, elle se trouve dans ComfyUI\ComfyUI\output (ou dans un sous-répertoire d'output si vous avez installé Save Image Extended).

Vous pouvez maintenant en générer plein d'autres... et nul besoin d'attendre que celle en cours de génération soit terminée ! Pendant qu'une image est en train d'être générée, modifiez vos paramètres à volonté et cliquez sur "Queue" à nouveau : tadaaa, votre tâche avec vos nouveaux paramètres vient d'être placée en file d'attente, elle sera traitée après celle en cours. Puis une autre, et encore une autre.... vous pouvez en mettre des tas en file d'attente si vous le souhaitez, et même quitter votre ordinateur et le laisser mouliner tranquillement pendant la nuit.

Vous pouvez consulter la file d'attente et l'historique des fichiers déjà générés à tout moment. Pour ce faire, dans la barre latérale à gauche, cliquez sur la première icône :

Un menu s'ouvre, il contient à la fois l'historique de vos images générées cette session, et la file d'attente. Vous pouvez à tout moment faire un clic droit sur l'une des tâches en attente pour charger le workflow correspondant ou encore pour annuler la tâche.

Voilà, vous savez utiliser (les bases de) ComfyUI et générer des images avec Stable Diffusion 3.5 et/ou Flux.1 Dev. Il est possible de faire des choses beaucoup plus complexes avec ComfyUI en développant des workflows spécifiques, ajoutant diverses fonctionnalités... upscaling, animation, inpainting, outpainting, embranchements, et même vidéo si vous avez un très gros GPU... les possibilités sont sans limites. 

Mais commencez déjà à expérimenter avec ce workflow simple et ces modèles "grand public". Il y a tant de choses que vous allez découvrir par vous-même simplement en testant... vous avez déjà de quoi vous amuser (et cet article est déjà bien assez long) ! Le reste, ce sera pour une prochaine fois !

 

Ressources :
Étiquettes