Aller au contenu principal

Module 5 — Retouche par masque et extension de cadre

L'image vers image du module précédent travaille sur toute l'image. Souvent, on veut l'inverse : modifier une zone précise en laissant le reste intact — remplacer un coussin, effacer un objet, redessiner un logo mal généré. C'est la retouche par masque, ou inpainting. Sa cousine, l'extension de cadre ou outpainting, invente ce qui se trouve au-delà des bords d'une image existante.

Le masque : une carte de ce qui peut changer

La retouche par masque prend deux entrées : l'image, et un masque binaire de mêmes dimensions. Là où le masque est blanc, le modèle est libre de redessiner ; là où il est noir, il doit préserver les pixels d'origine.

Techniquement, à chaque étape de débruitage, le pipeline remélange le latent : la partie hors masque est réinjectée depuis la vraie image (avec le bruit correspondant à l'étape), et la partie sous le masque conserve le débruitage en cours. On obtient ainsi une génération contrainte : le modèle ne peut plus dériver dans les zones que vous avez verrouillées.

C'est cette logique qui rend le résultat propre — pas de reprise pixel à pixel manuelle, pas de flou de bord — à condition que la consigne décrive le contenu total de l'image, pas seulement ce qu'on remplace. Écrire simplement « un coussin rouge » pour remplacer un coussin bleu produit souvent une génération qui ignore la chaise autour ; il faut écrire « une chaise scandinave avec un coussin rouge, atelier lumineux, photographie produit ».

Les modèles dédiés à la retouche

Stable Diffusion propose deux options. La première est d'utiliser un modèle standard (SDXL base) avec un pipeline d'inpainting qui simule la contrainte de masque à chaque étape. Cela fonctionne raisonnablement, mais l'ajustement des bords est parfois imparfait.

La seconde option est d'utiliser un modèle spécialisé (sd-xl-inpainting, sd-1.5-inpainting) : il a été affiné sur des paires (image, image masquée) et intègre le masque dans sa première couche de convolution. Le résultat est nettement meilleur sur les transitions, les ombres portées et la cohérence colorimétrique aux bords.

import torch
from PIL import Image
from diffusers import StableDiffusionXLInpaintPipeline

pipeline = StableDiffusionXLInpaintPipeline.from_pretrained(
"diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
torch_dtype=torch.float16,
).to("cuda")

image = Image.open("chaise-avec-coussin-bleu.png").resize((1024, 1024))
masque = Image.open("masque-coussin.png").convert("L").resize((1024, 1024))

resultat = pipeline(
prompt="une chaise scandinave avec un coussin rouge en velours cotele, "
"atelier lumineux, photographie produit, haute definition",
image=image,
mask_image=masque,
strength=0.85,
num_inference_steps=30,
guidance_scale=7.5,
).images[0]

resultat.save("chaise-coussin-rouge.png")

Gestion pratique du masque et de la marge

Trois précautions rendent la retouche prévisible.

Dilater le masque de quelques pixels au-delà de la zone à changer. Un masque qui colle exactement aux contours de l'objet à remplacer force le modèle à générer un remplaçant aux dimensions identiques, souvent au prix de mauvais raccords. Une marge de 10 à 20 pixels donne au modèle l'espace pour ajuster silhouette et ombre.

Flouter légèrement les bords du masque (un flou gaussien de 2 à 4 pixels). Le pipeline mélange alors progressivement la génération et l'original sur cette bande de transition ; les bords deviennent invisibles.

Force de débruitage entre 0,8 et 1,0 dans la zone masquée. Contrairement à l'image vers image, où l'on garde souvent des forces modérées, la retouche par masque bénéficie d'une force élevée : c'est bien la zone masquée qu'on veut regénérer, pas la retoucher.

L'extension de cadre : agrandir le monde par l'image

L'outpainting étend une image au-delà de son cadre d'origine. Le principe est le même que la retouche par masque : on colle l'image d'origine sur un canevas plus grand, on masque la zone ajoutée, et on laisse le modèle générer.

Pour le fil rouge — passer d'une photo carrée de chaise à un format bannière 16:9 — la logique se déroule en deux gestes.

Premier geste : agrandir progressivement. Passer d'un coup d'un carré à une bannière très large échoue presque toujours ; le modèle n'a pas assez d'ancrage dans l'image d'origine et invente une scène incohérente. Il faut procéder par étapes de 25 % à 40 % à chaque passage, en réinjectant le résultat comme nouvelle image de base à l'étape suivante.

Second geste : soigner la consigne, qui doit décrire ce qu'on veut voir apparaître de chaque côté. « Une chaise scandinave dans un atelier lumineux, avec une bibliothèque en bois à gauche et une fenêtre à droite » guide bien mieux que la consigne d'origine qui ne parlait que de la chaise.

Cohérence des bords : le vrai piège

L'artefact typique de l'extension est la couture visible entre l'image d'origine et la zone ajoutée : différence de teinte, de bruit numérique, de netteté. Trois techniques réduisent le phénomène.

Utiliser une marge de recouvrement — la zone ajoutée déborde de quelques dizaines de pixels sur l'image d'origine, avec un masque en dégradé — pour laisser le modèle harmoniser les deux.

Faire un passage d'image vers image final à faible force (0,15 à 0,25) sur toute l'image reconstituée, avec la consigne complète. Cela homogénéise la texture globale sans trop toucher au contenu.

Enfin, éviter d'étendre au-delà de deux ou trois passes : chaque itération éloigne un peu de l'original, et une extension excessive finit par produire une image qui n'a plus grand chose à voir avec le point de départ.

La retouche n'est pas une gomme magique

Effacer un objet, c'est demander au modèle d'inventer ce qui se trouve derrière. Sur un fond uni, ça marche presque toujours. Sur un fond complexe (une bibliothèque avec des livres identifiables, un paysage détaillé), le modèle invente du contenu qui n'y était pas. Ce n'est ni une reconstitution ni une preuve : c'est une génération plausible, et il faut la présenter comme telle.

En résumé

  • Le masque verrouille les pixels à préserver et libère ceux à regénérer ; la consigne doit décrire toute l'image, pas juste la modification.
  • Les modèles dédiés à la retouche (avec masque intégré à la première couche) donnent de bien meilleurs raccords que les modèles standards en mode retouche.
  • Dilater et flouter légèrement le masque, garder une force de 0,8 à 1,0 dans la zone masquée : trois réglages qui rendent la retouche prévisible.
  • L'extension de cadre procède par petits pas (25 à 40 % à la fois), avec une consigne qui décrit ce qu'on veut voir apparaître et une passe finale d'harmonisation.

Module suivant : ControlNet, la voie qui permet enfin d'imposer une composition, une pose ou une profondeur au modèle par un canal autre que le texte.