Aller au contenu

Ce sont des surfaces de contrôle : comment je génère des images

Ça dépend de votre méthode de travail et du médium dans lequel vous voulez travailler.

La première chose à piger, c’est qu’on ne « fait pas de l’art avec l’IA » en appuyant sur un bouton, sauf si on choisit délibérément la version la plus chiante de l’outil.

Il y a plusieurs pièces dans le processus : le matériau de départ, le modèle, le prompt, l’échantillonneur, le planificateur, la graine, le bruit latent, le VAE, les masques, les images de contrôle, les images de référence, les adaptateurs, les outils d’agrandissement et le post-traitement. Ce ne sont pas des mots magiques. Ce sont des surfaces de contrôle.

Si vous travaillez sur un workflow de transformation, surtout avec beaucoup d’inpainting, vous commencez généralement dans Photoshop, Krita, Procreate, Blender, avec un appareil photo, un scanner ou n’importe quel outil qui vous fournit du matériel source. On crée d’abord un truc. Un dessin, un gribouillage, un collage, un rendu, une photo, un tas de débris visuels. Les gribouillages sont utiles ici, tant qu’ils sont assez reconnaissables pour déclencher les associations apprises par le modèle. Avec un niveau de denoise assez élevé, un concept brut peut devenir un élément fini assez rapidement.

J’aime les collages parce que le résultat est moins prévisible. Je fabrique une image de départ avec des textures qui jurent, de vieux dessins, des photos, des bouts d’images générées, des traces de peinture, une perspective de travers, bref, n’importe quelle dissonance qui donne au modèle un truc intéressant à mâcher. Le travail de départ ne disparaît pas. Il influe sur tout le projet. Le modèle y réagit, se dispute avec lui, en garde une partie, en comprend une autre de travers et, parfois, fait de l’accident le meilleur morceau.

Construire le graphe de génération

Dans ComfyUI, le gros du travail, avant même de commencer, c’est de bâtir votre graphe de nœuds.

Un graphe text-to-image basique commence par un checkpoint loader. Ça charge le modèle, généralement avec CLIP et le VAE. Le prompt textuel va dans un encodeur de texte. Le prompt négatif va dans un autre encodeur de texte. Un nœud d’image latente vide crée l’espace latent de départ à la résolution de votre choix. Ces conditionnements, le latent, le modèle, la seed, le sampler, le scheduler, le nombre de steps et la valeur CFG alimentent tous le nœud sampler. Le sampler débruite le latent. Le nœud VAE decode transforme ce latent en pixels. Ensuite, le nœud save image l’enregistre.

C’est le graphe de nœuds le plus basique possible.

Loader de modèle vers sampler. Prompts vers sampler. Latent vers sampler. Sampler vers VAE decode. Decode vers save.

Même là, vous avez des choix. Changez le checkpoint ou le « modèle » et le vocabulaire visuel change. Changez le sampler et le chemin à travers le bruit change. Changez le scheduler et le timing du denoise change. Changez la seed et le champ de bruit initial change. Changez le CFG et le modèle écoute le prompt plus ou moins agressivement. Changez le VAE et l’interprétation finale des pixels peut faire varier la couleur, le contraste ou le détail.
On me suit toujours, ou vous commencez à décrocher ?

On continue.

Inpainting et denoise

Au lieu de partir d’un latent vide, on charge une image source et un masque. L’image source est encodée dans l’espace latent par le VAE. Le masque indique au sampler quelle partie de ce latent peut être modifiée. On passe le latent masqué dans un sampler d’inpainting ou un chemin de conditionnement d’inpainting, selon le workflow.

Le prompt décrit ce qui doit exister dans la zone modifiée. Ensuite, la valeur de denoise contrôle à quel point le modèle est autorisé à réinterpréter la zone, tandis que le CFG ajuste votre poids sémantique.

C’est ça le point crucial. Le denoise, c’est la marge de manœuvre que vous laissez au modèle.

Un denoise faible, ça veut dire : « reste proche de la source ».

Un denoise moyen, ça veut dire : « improvise, mais garde la structure ».

Un denoise élevé, ça veut dire : « sers-toi de ça comme rampe de lancement ».

Le meilleur modèle mental, c’est de voir ça comme une improvisation sur une surface floue. Un flou léger apporte des changements mineurs, un flou prononcé permet une impro radicale.

L’inpainting est une sorte de réinterprétation contrôlée. Le masque est la frontière entre ce que vous protégez et ce que vous laissez le modèle prédire.

Vous pouvez créer ce masque dans Photoshop. Le peindre à la main. Le flouter, l’accentuer, l’agrandir, le réduire, le contourer, l’inverser, le combiner avec l’alpha ou le générer par segmentation.

Vous pouvez utiliser SAM (Segment Anything Model) pour isoler une personne, un visage, une chemise, un objet en arrière-plan ou une zone du cadre. Vous pouvez utiliser des cartes de profondeur ou de contours pour construire un masque. Vous pouvez faire la roto à la main si vous vous détestez ou si vous aimez tellement la précision que la différence devient purement académique.

ControlNet et contraintes structurelles

Ça signifie que le graphe ajoute une branche de conditionnement (ou plusieurs). Vous chargez un modèle ControlNet, vous chargez ou générez une image de contrôle, vous prétraitez cette image pour obtenir le bon type de carte, et vous injectez le conditionnement de contrôle résultant dans le sampler, en parallèle du conditionnement du prompt.

Si vous voulez une pose, vous utilisez OpenPose ou un truc du genre. Si vous voulez préserver le trait, vous utilisez Canny, HED, Scribble ou Lineart. Ça dépend, c’est un peu au feeling.
Si vous voulez de la composition, vous utilisez un modèle de profondeur comme MiDaS. Pour les compositions artistiques, j’aime les combinaisons équilibrées de normal maps, de profondeur et de HED, parce qu’ensemble, ils préservent la forme, la disposition spatiale et l’énergie des contours sans figer l’image entière en un petit diagramme technique sans vie.

ControlNet est une famille de contraintes structurelles.

On peut les empiler. La pose contrôle le corps, la profondeur contrôle l’espace, HED contrôle le contour graphique, et le prompt contrôle l’interprétation. Chacun reçoit une valeur de force. Chacun peut commencer et s’arrêter à différents moments du processus de diffusion. Peut-être que vous voulez que la pose compte tout le long, mais que la carte de contours ne compte qu’au début. Peut-être que vous voulez que la profondeur garde la pièce intacte, mais que les détails de surface dérivent.

Félicitations mon ami ! Vous êtes en train de mixer des contraintes à travers le planning de denoising.

Ça fait du bien, non ?

Identité et cohérence

Un LoRA est un petit adaptateur entraîné pour biaiser le modèle vers un sujet, un style, un objet, une tenue, une habitude de rendu ou un vocabulaire visuel. Donc oui, vous pouvez avoir des modèles dans vos modèles pendant que vous modélisez des trucs. Si ça ne suffit pas, vous pouvez utiliser des embeddings, IPAdapter, le conditionnement de référence, des outils de référence faciale ou un checkpoint réentraîné. Si vous voulez vraiment pousser le délire, on peut parler des hypernetworks, qui sont une autre couche d'« IA qui modifie le comportement de l’IA », parce qu’apparemment, le monstre de la récursion n’avait pas fini de construire des trucs.

Le graphe pour ça suit généralement un schéma de chargement et d’attache. Vous chargez le LoRA et vous l’appliquez au modèle et à CLIP avant l’échantillonnage. Vous chargez IPAdapter, vous lui donnez une image de référence, vous encodez cette image via un modèle de vision, et vous passez ce conditionnement au sampler. Vous utilisez les outils de référence quand vous voulez que le résultat hérite d’une identité visuelle d’une image sans être piégé par la composition de la source.

Upscaling

Alors, vous avez cette magnifique image, mais elle est en basse résolution par rapport au rendu pro utilisable que vous voulez. Qu’est-ce que vous allez faire ?

Bon, un upscale simple peut prendre l’image décodée, l’agrandir avec un modèle d’upscale, puis lancer une autre passe img2img avec un denoise faible pour restaurer les détails. Un graphe d’upscale plus sérieux pourrait découper l’image en tuiles, traiter chaque tuile, fondre les jointures, préserver la composition globale, puis faire une passe finale de nettoyage.

L’upscale latent modifie le latent avant le décodage. L’upscale pixel agrandit après le décodage. La diffusion par tuiles tente d’obtenir plus de détails sans faire exploser la VRAM. Et maintenant, il y en a un nouveau qui zappe complètement l’étape du latent pour passer direct à de l’édition d’image directe absurdement lourde, ce qui... est magnifique.

Nouveau problème : « agrandir » et « ajouter des détails plausibles » ne sont pas la même opération.

C’est donc un arbitrage à faire quand on en arrive là.

Vidéo et cohérence temporelle

La vidéo, c’est là que la machine commence à fumer dans des couleurs bizarres.

Une image fixe n’a besoin d’être cohérente qu’une seule fois. La vidéo doit le rester dans le temps, ce qui signifie que chaque image hérite des problèmes de la précédente et en invente de nouveaux pour la suivante. Si votre workflow ne gère pas la cohérence temporelle, il arrive des trucs chelous. Certains artistes font ça exprès. Mon préféré, c’est le gars aux membres qui explosent. On dirait un film d’action japonais... jusqu’à ce que ça ne le soit plus.

En partant du principe que vous n’êtes pas branchés body horror ou surréalisme pur, il y a plusieurs façons d’aborder le truc.

Dans un workflow image-to-video, on part d’une image fixe ou d’une image clé et on utilise un modèle vidéo pour générer le mouvement. C’est top pour des plans courts, des boucles animées, des glissements de caméra, des mouvements de personnages ou des effets d’ambiance. Le graphe charge généralement le modèle vidéo, encode l’image de départ, règle les paramètres de mouvement, échantillonne une séquence de frames latentes, les décode et les combine dans un fichier vidéo. Le défi, c’est qu’on abandonne une partie du contrôle à l’idée du mouvement qu’a le modèle vidéo.

Dans un workflow image par image, on part de rushes sources. On extrait les frames, on les traite via img2img ou inpainting, puis on les réassemble. Ça donne plus de contrôle, mais ça crée des problèmes temporels. Chaque frame peut dériver. Les petites incohérences deviennent du scintillement. Le visage du personnage peut muter. La texture peut ramper. L’arrière-plan peut respirer comme s’il avait un avis sur la question.

Pour combattre ça, on utilise des contraintes. On garde les seeds stables ou on les fait varier avec prudence. On utilise un denoise faible quand on a besoin de préservation. On utilise ControlNet à partir des rushes originaux, souvent avec des maps de profondeur, de lineart ou de pose. On utilise l’optical flow ou le motion guidance quand c’est disponible. On tracke les masques d’une frame à l’autre au lieu de les repeindre au hasard. On peut rendre les images clés d’abord, puis interpoler entre elles. On peut utiliser la propagation style EbSynth, ControlNet vidéo, des modules de mouvement style AnimateDiff, ou un modèle vidéo pour stabiliser le mouvement.

En inpainting vidéo, le masque devient un objet temporel. Ce n’est plus juste « peindre cette région ». Si vous avez déjà utilisé un truc comme DaVinci Resolve ou Premiere, c’est le même concept général.

On peut générer des masques par segmentation, les nettoyer manuellement, les tracker tout au long du plan, les adoucir pour éviter les jointures nettes, puis inpainter la zone masquée avec assez de denoise pour la modifier, mais pas trop pour qu’elle ne se détache pas des rushes.

C’est là que le workflow devient très spécifique au médium.

Si je change une chemise sur une image fixe, je masque la chemise, je prompte le nouveau vêtement, j’inpainte, je nettoie les bords et je fais l’upscale.

Si je change une chemise dans une vidéo, j’ai besoin que le masque suive le torse, survive aux mouvements de bras, gère les plis, évite de bouffer le cou et les cheveux, maintienne l’identité du tissu d’une frame à l’autre, et ne scintille pas comme une serviette maudite.

Même idée. Niveau de difficulté différent.

Le graphe Comfy pour la vidéo devient généralement une chaîne de petits graphes. Un graphe extrait ou charge les images. Un autre génère les cartes de contrôle. Un autre gère les masques. Un autre s’occupe de l’img2img ou de l’inpainting. Un autre fait l’upscale ou l’interpolation. Un dernier rassemble les images pour recréer la vidéo. On peut faire une partie de tout ça dans Comfy, une partie à l’extérieur, et une partie dans un logiciel de montage. Les workflows les plus propres sont rarement un seul graphe géant. Ce sont généralement des pipelines par étapes.

Voilà.
Maintenant, vous savez comment faire.

Les workflows multi-références, c’est un autre sujet. Peut-être la prochaine fois.