# Inpainting

L’inpainting remplace ou modifie des zones spécifiques d’une image. Il s’agit donc d’un outil utile pour la restauration d’images, comme la suppression de défauts et d’artefacts, ou même le remplacement d’une zone d’image par un contenu entièrement nouveau. L’inpainting s’appuie sur un masque pour déterminer quelles régions de l’image doivent être remplies ; la zone à inpainter est représentée par des pixels blancs et la zone à conserver par des pixels noirs. Les pixels blancs sont remplis par le prompt.

Avec 🤗 Diffusers, voici comment effectuer de l'inpainting :

1. Chargez un point de contrôle d'inpainting avec la classe [AutoPipelineForInpainting](/docs/diffusers/v0.43.0/fr/api/pipelines/auto_pipeline#diffusers.AutoPipelineForInpainting). Cette classe détectera automatiquement la classe de pipeline appropriée à charger en fonction du point de contrôle :

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "kandinsky-community/kandinsky-2-2-decoder-inpaint", dtype=torch.float16
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()
```

> [!TIP]
> Vous remarquerez tout au long du guide que nous utilisons [enable_model_cpu_offload()](/docs/diffusers/v0.43.0/fr/api/pipelines/overview#diffusers.DiffusionPipeline.enable_model_cpu_offload) et [enable_xformers_memory_efficient_attention()](/docs/diffusers/v0.43.0/fr/api/pipelines/overview#diffusers.DiffusionPipeline.enable_xformers_memory_efficient_attention) pour économiser de la mémoire et augmenter la vitesse d'inférence. Si vous utilisez PyTorch 2.0, il n'est pas nécessaire d'appeler [enable_xformers_memory_efficient_attention()](/docs/diffusers/v0.43.0/fr/api/pipelines/overview#diffusers.DiffusionPipeline.enable_xformers_memory_efficient_attention) sur votre pipeline, car il utilisera déjà le [scaled-dot product attention](../optimization/fp16#scaled-dot-product-attention) natif de PyTorch 2.0.

2. Charger les images de base et de masque :

```py
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")
```

3. Créez un prompt pour l’image à inpainter et passez-le au pipeline avec les images de base et de masque :

```py
prompt = "a black cat with glowing eyes, cute, adorable, disney, pixar, highly detailed, 8k"
negative_prompt = "bad anatomy, deformed, ugly, disfigured"
image = pipeline(prompt=prompt, negative_prompt=negative_prompt, image=init_image, mask_image=mask_image).images[0]
make_image_grid([init_image, mask_image, image], rows=1, cols=3)
```

  
    
    image de base
  
  
    
    masque d'image
  
  
    
    image générée
  

## Créer une image de masque

Tout au long de ce guide, l’image de masque est fournie dans tous les exemples de code pour plus de commodité. Vous pouvez effectuer de l’inpainting sur vos propres images, mais vous devrez créer une image de masque à cet effet. Utilisez l’espace ci-dessous pour créer facilement une image de masque.

Téléchargez une image de base sur laquelle effectuer l'inpainting et utilisez l'outil de croquis pour dessiner un masque. Une fois terminé, cliquez sur **Run** pour générer et télécharger l'image du masque.

<iframe src="https://stevhliu-inpaint-mask-maker.hf.space" frameborder="0" width="850" height="450"
>

### Flou du masque

La méthode [blur()](/docs/diffusers/v0.43.0/fr/api/image_processor#diffusers.VaeImageProcessor.blur) offre une option pour définir la manière de fusionner l'image d'origine et la zone d'inpainting. Le niveau de flou est déterminé par le paramètre `blur_factor`. Augmenter la valeur de `blur_factor` augmente le flou appliqué aux bords du masque, adoucissant ainsi la transition entre l'image d'origine et la zone d'inpainting. Une valeur faible ou nulle de `blur_factor` préserve les bords plus nets du masque.

Pour l'utiliser, créez un masque flou avec le processeur d'images.

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image
from PIL import Image

pipeline = AutoPipelineForInpainting.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to('cuda')  # or "mps", "xpu", "cpu"

mask = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/seashore_mask.png")
blurred_mask = pipeline.mask_processor.blur(mask, blur_factor=33)
blurred_mask
```

  
    
    masque sans flou
  
  
    
    masque avec flou appliqué
  

## Modèles populaires

[Stable Diffusion Inpainting](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-inpainting), [Stable Diffusion XL (SDXL) Inpainting](https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1) et [Kandinsky 2.2 Inpainting](https://huggingface.co/kandinsky-community/kandinsky-2-2-decoder-inpaint) comptent parmi les modèles les plus populaires pour l'inpainting. SDXL génère généralement des images de résolution supérieure à celles de Stable Diffusion v1.5, et Kandinsky 2.2 est également capable de produire des images de haute qualité.

### Stable Diffusion Inpainting

Stable Diffusion Inpainting est un modèle de diffusion latente affiné sur des images de 512x512 pour l'inpainting. C'est un bon point de départ car il est relativement rapide et génère des images de bonne qualité. Pour utiliser ce modèle pour l'inpainting, vous devez passer un prompt, une image de base et un masque à la pipeline :

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-inpainting", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")

generator = torch.Generator("cuda").manual_seed(92)
prompt = "concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k"
image = pipeline(prompt=prompt, image=init_image, mask_image=mask_image, generator=generator).images[0]
make_image_grid([init_image, mask_image, image], rows=1, cols=3)
```

### Inpainting avec Stable Diffusion XL (SDXL)

SDXL est une version plus grande et plus puissante de Stable Diffusion v1.5. Ce modèle peut suivre un processus de modèle en deux étapes (bien que chaque modèle puisse également être utilisé seul) ; le modèle de base génère une image, et un modèle de raffinement prend cette image pour en améliorer davantage les détails et la qualité. Consultez le guide [SDXL](../api/pipelines/stable_diffusion/stable_diffusion_xl) pour un guide plus complet sur l'utilisation de SDXL et la configuration de ses paramètres.

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "diffusers/stable-diffusion-xl-1.0-inpainting-0.1", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")

generator = torch.Generator("cuda").manual_seed(92)
prompt = "concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k"
image = pipeline(prompt=prompt, image=init_image, mask_image=mask_image, generator=generator).images[0]
make_image_grid([init_image, mask_image, image], rows=1, cols=3)
```

### Kandinsky 2.2 Inpainting

La famille de modèles Kandinsky est similaire à SDXL car elle utilise également deux modèles ; le modèle d’antécédent d’image crée des embeddings d’image, et le modèle de diffusion génère des images à partir de ceux-ci. Vous pouvez charger le modèle d’antécédent d’image et le modèle de diffusion séparément, mais la façon la plus simple d’utiliser Kandinsky 2.2 est de le charger dans la classe [AutoPipelineForInpainting](/docs/diffusers/v0.43.0/fr/api/pipelines/auto_pipeline#diffusers.AutoPipelineForInpainting), qui utilise [KandinskyV22InpaintCombinedPipeline](/docs/diffusers/v0.43.0/fr/api/pipelines/kandinsky_v22#diffusers.KandinskyV22InpaintCombinedPipeline) en interne.

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "kandinsky-community/kandinsky-2-2-decoder-inpaint", dtype=torch.float16
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")

generator = torch.Generator("cuda").manual_seed(92)
prompt = "concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k"
image = pipeline(prompt=prompt, image=init_image, mask_image=mask_image, generator=generator).images[0]
make_image_grid([init_image, mask_image, image], rows=1, cols=3)
```

  
    
    image de base
  
  
    
    Stable Diffusion Inpainting
  
  
    
    Stable Diffusion XL Inpainting
  
  
    
    Kandinsky 2.2 Inpainting
  

## Points de contrôle non spécifiques à l'inpainting

Jusqu’à présent, ce guide a utilisé des points de contrôle spécifiques à l’inpainting, tels que [stable-diffusion-v1-5/stable-diffusion-inpainting](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-inpainting). Mais vous pouvez également utiliser des points de contrôle classiques comme [stable-diffusion-v1-5/stable-diffusion-v1-5](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5). Comparons les résultats des deux points de contrôle.

L’image de gauche est générée à partir d’un point de contrôle standard, tandis que l’image de droite provient d’un point de contrôle d’inpainting. Vous remarquerez immédiatement que l’image de gauche est moins propre et que le contour de la zone que le modèle est censé inpainter reste visible. L’image de droite est beaucoup plus propre et la zone inpaintée apparaît plus naturelle.

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")

generator = torch.Generator("cuda").manual_seed(92)
prompt = "concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k"
image = pipeline(prompt=prompt, image=init_image, mask_image=mask_image, generator=generator).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
```

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-inpainting", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")

generator = torch.Generator("cuda").manual_seed(92)
prompt = "concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k"
image = pipeline(prompt=prompt, image=init_image, mask_image=mask_image, generator=generator).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
```

  
    
    stable-diffusion-v1-5/stable-diffusion-v1-5
  
  
    
    stable-diffusion-v1-5/stable-diffusion-inpainting
  

Cependant, pour des tâches plus basiques comme effacer un objet d'une image (par exemple, les rochers sur la route), un point de contrôle standard donne des résultats assez bons. La différence entre le point de contrôle standard et le point de contrôle d'inpainting n'est pas aussi marquée.

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/road-mask.png")

image = pipeline(prompt="road", image=init_image, mask_image=mask_image).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
```

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-inpainting", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/road-mask.png")

image = pipeline(prompt="road", image=init_image, mask_image=mask_image).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
```

  
    
    stable-diffusion-v1-5/stable-diffusion-v1-5
  
  
    
    stable-diffusion-v1-5/stable-diffusion-inpainting
  

Le compromis lié à l’utilisation d’un checkpoint non spécifique à l’inpainting est que la qualité globale de l’image peut être inférieure, mais il a généralement tendance à préserver la zone masquée (c’est pourquoi vous pouvez voir le contour du masque). Les checkpoints spécifiques à l’inpainting sont entraînés intentionnellement pour générer des images inpaintées de plus haute qualité, ce qui inclut la création d’une transition plus naturelle entre les zones masquées et non masquées. En conséquence, ces checkpoints sont plus susceptibles de modifier votre zone non masquée.

Si la préservation de la zone non masquée est importante pour votre tâche, vous pouvez utiliser la méthode [VaeImageProcessor.apply_overlay()](/docs/diffusers/v0.43.0/fr/api/image_processor#diffusers.VaeImageProcessor.apply_overlay) pour forcer la zone non masquée d’une image à rester identique, au prix de transitions légèrement moins naturelles entre les zones masquée et non masquée.

```py
import PIL
import numpy as np
import torch

from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

device = "cuda"  # or "mps", "xpu", "cpu"
pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-inpainting",
    dtype=torch.float16,
    variant="fp16"
)
pipeline = pipeline.to(device)

img_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png"
mask_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png"

init_image = load_image(img_url).resize((512, 512))
mask_image = load_image(mask_url).resize((512, 512))

prompt = "Face of a yellow cat, high resolution, sitting on a park bench"
repainted_image = pipeline(prompt=prompt, image=init_image, mask_image=mask_image).images[0]
repainted_image.save("repainted_image.png")

unmasked_unchanged_image = pipeline.image_processor.apply_overlay(mask_image, init_image, repainted_image)
unmasked_unchanged_image.save("force_unmasked_unchanged.png")
make_image_grid([init_image, mask_image, repainted_image, unmasked_unchanged_image], rows=2, cols=2)
```

## Configurer les paramètres du pipeline

Les caractéristiques de l’image – comme la qualité et la « créativité » – dépendent des paramètres du pipeline. Comprendre le rôle de ces paramètres est essentiel pour obtenir les résultats souhaités. Examinons les paramètres les plus importants et voyons comment leur modification affecte la sortie.

### Force

`strength` est une mesure de la quantité de bruit ajoutée à l'image de base, ce qui influence le degré de ressemblance entre l'image de sortie et l'image de base.

* 📈 une valeur de `strength` élevée signifie qu'un plus grand niveau de bruit est ajouté à l'image et que le processus de débruitage prend plus de temps, mais vous obtiendrez des images de meilleure qualité, plus différentes de l'image de base
* 📉 une valeur de `strength` faible signifie qu'un niveau de bruit plus faible est ajouté à l'image et que le processus de débruitage est plus rapide, mais la qualité de l'image peut être moindre et l'image générée ressemble davantage à l'image de base

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-inpainting", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")

prompt = "concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k"
image = pipeline(prompt=prompt, image=init_image, mask_image=mask_image, strength=0.6).images[0]
make_image_grid([init_image, mask_image, image], rows=1, cols=3)
```

  
    
    strength = 0.6
  
  
    
    strength = 0.8
  
  
    
    strength = 1.0
  

### Échelle de guidage

`guidance_scale` influence le degré d’alignement entre le prompt texte et l’image générée.

* 📈 une valeur élevée de `guidance_scale` signifie que le prompt et l'image générée sont étroitement alignés, de sorte que la sortie est une interprétation plus stricte du prompt
* 📉 une valeur faible de `guidance_scale` signifie que l'alignement entre le prompt et l'image générée est plus lâche, ce qui peut rendre la sortie plus variée par rapport au prompt

Vous pouvez utiliser `strength` et `guidance_scale` ensemble pour un meilleur contrôle sur l'expressivité du modèle. Par exemple, une combinaison de valeurs élevées de `strength` et de `guidance_scale` accorde au modèle la plus grande liberté créative.

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-inpainting", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")

prompt = "concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k"
image = pipeline(prompt=prompt, image=init_image, mask_image=mask_image, guidance_scale=2.5).images[0]
make_image_grid([init_image, mask_image, image], rows=1, cols=3)
```

  
    
    guidance_scale = 2.5
  
  
    
    guidance_scale = 7.5
  
  
    
    guidance_scale = 12.5
  

### Prompt négatif

Un prompt négatif joue le rôle inverse d'un prompt ; il guide le modèle pour l'empêcher de générer certains éléments dans une image. Cela est utile pour améliorer rapidement la qualité de l'image et empêcher le modèle de générer des éléments indésirables.

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-inpainting", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")

prompt = "concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k"
negative_prompt = "bad architecture, unstable, poor details, blurry"
image = pipeline(prompt=prompt, negative_prompt=negative_prompt, image=init_image, mask_image=mask_image).images[0]
make_image_grid([init_image, mask_image, image], rows=1, cols=3)
```

  
    
    negative_prompt = "bad architecture, unstable, poor details, blurry"
  

### Recadrage du masque de bourrage

Une méthode pour améliorer la qualité de l'image en inpainting consiste à utiliser le paramètre [`padding_mask_crop`](https://huggingface.co/docs/diffusers/v0.25.0/en/api/pipelines/stable_diffusion/inpaint#diffusers.StableDiffusionInpaintPipeline.__call__.padding_mask_crop). Une fois activée, cette option recadre la zone masquée avec un certain padding spécifié par l'utilisateur et recadre également la même zone sur l'image d'origine. L'image et le masque sont ensuite mis à l'échelle vers une résolution plus élevée pour l'inpainting, puis superposés sur l'image d'origine. C'est une méthode rapide et simple pour améliorer la qualité de l'image sans utiliser un pipeline distinct comme [StableDiffusionUpscalePipeline](/docs/diffusers/v0.43.0/fr/api/pipelines/stable_diffusion/upscale#diffusers.StableDiffusionUpscalePipeline).

Ajoutez le paramètre `padding_mask_crop` à l'appel du pipeline et définissez-le sur la valeur de bourrage souhaitée.

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image
from PIL import Image

generator = torch.Generator(device='cuda').manual_seed(0)  # or "mps", "xpu", "cpu"
pipeline = AutoPipelineForInpainting.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to('cuda')

base = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/seashore.png")
mask = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/seashore_mask.png")

image = pipeline("boat", image=base, mask_image=mask, strength=0.75, generator=generator, padding_mask_crop=32).images[0]
image
```

  
    
    image inpaint par défaut
  
  
    
    inpaint image avec `padding_mask_crop` activé
  

## Pipelines d'inpainting en chaîne

[AutoPipelineForInpainting](/docs/diffusers/v0.43.0/fr/api/pipelines/auto_pipeline#diffusers.AutoPipelineForInpainting) peut être enchaîné avec d’autres pipelines 🤗 Diffusers pour modifier leurs sorties. Cela est souvent utile pour améliorer la qualité des sorties de vos autres pipelines de diffusion, et si vous utilisez plusieurs pipelines, il peut être plus efficace en mémoire de les enchaîner afin de conserver les sorties dans l’espace latent et de réutiliser les mêmes composants de pipeline.

### Texte-vers-image-vers-inpaint

Enchaîner un pipeline de génération d’image à partir de texte et un pipeline d’inpainting permet de retoucher l’image générée, sans avoir à fournir d’image de base au départ. Cela facilite la modification de vos sorties préférées de génération d’image à partir de texte, sans avoir à générer une image entièrement nouvelle.

Commencez par le pipeline texte-vers-image pour créer un château :

```py
import torch
from diffusers import AutoPipelineForText2Image, AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

text2image = pipeline("concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k").images[0]
```

Charger l’image du masque de la sortie ci-dessus :

```py
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_text-chain-mask.png")
```

Et peuplons la zone masquée avec une cascade :

```py
pipeline = AutoPipelineForInpainting.from_pretrained(
    "kandinsky-community/kandinsky-2-2-decoder-inpaint", dtype=torch.float16
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

prompt = "digital painting of a fantasy waterfall, cloudy"
image = pipeline(prompt=prompt, image=text2image, mask_image=mask_image).images[0]
make_image_grid([text2image, mask_image, image], rows=1, cols=3)
```

  
    
    texte-vers-image
  
  
    
    inpaint
  

### Inpaint-to-image-to-image

Vous pouvez également enchaîner un pipeline d'inpainting avant un autre pipeline, comme image-to-image ou un upscaler, afin d'améliorer la qualité.

Commencez par retoucher une image :

```py
import torch
from diffusers import AutoPipelineForInpainting, AutoPipelineForImage2Image
from diffusers.utils import load_image, make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-inpainting", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")

prompt = "concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k"
image_inpainting = pipeline(prompt=prompt, image=init_image, mask_image=mask_image).images[0]

# resize image to 1024x1024 for SDXL
image_inpainting = image_inpainting.resize((1024, 1024))
```

Passons maintenant l'image à un autre pipeline d'inpainting avec le modèle refiner de SDXL pour améliorer les détails et la qualité de l'image :

```py
pipeline = AutoPipelineForInpainting.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0", dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

image = pipeline(prompt=prompt, image=image_inpainting, mask_image=mask_image, output_type="latent").images[0]
```

> [!TIP]
> Il est important de spécifier `output_type="latent"` dans le pipeline pour conserver toutes les sorties dans l'espace latent et éviter une étape de décodage-encodage inutile. Cela ne fonctionne que si les pipelines enchaînés utilisent le même VAE. Par exemple, dans la section [Text-to-image-to-inpaint](#text-to-image-to-inpaint), Kandinsky 2.2 utilise une classe de VAE différente de celle du modèle Stable Diffusion, ce qui l'empêche de fonctionner. En revanche, si vous utilisez Stable Diffusion v1.5 pour les deux pipelines, vous pouvez tout conserver dans l'espace latent car ils utilisent tous deux [AutoencoderKL](/docs/diffusers/v0.43.0/fr/api/models/autoencoderkl#diffusers.AutoencoderKL).

Enfin, vous pouvez passer cette image à un pipeline image-vers-image pour lui apporter les finitions. Il est plus efficace d’utiliser la méthode [from_pipe()](/docs/diffusers/v0.43.0/fr/api/pipelines/auto_pipeline#diffusers.AutoPipelineForImage2Image.from_pipe) pour réutiliser les composants existants du pipeline et éviter de recharger inutilement tous les composants du pipeline en mémoire.

```py
pipeline = AutoPipelineForImage2Image.from_pipe(pipeline)
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

image = pipeline(prompt=prompt, image=image).images[0]
make_image_grid([init_image, mask_image, image_inpainting, image], rows=2, cols=2)
```

  
    
    image initiale
  
  
    
    inpaint
  
  
    
    image-vers-image
  

La génération d’image à partir d’image et l’inpainting sont en réalité des tâches très similaires. La génération d’image à partir d’image produit une nouvelle image qui ressemble à l’image fournie. L’inpainting fait la même chose, mais ne transforme que la zone de l’image définie par le masque, le reste de l’image restant inchangé. On peut considérer l’inpainting comme un outil plus précis pour effectuer des modifications spécifiques, tandis que la génération d’image à partir d’image offre un champ d’action plus large pour des modifications plus globales.

## Contrôler la génération d'images

Obtenir une image qui correspond exactement à vos attentes est un défi, car le processus de débruitage est aléatoire. Bien que vous puissiez contrôler certains aspects de la génération en configurant des paramètres tels que `negative_prompt`, il existe des méthodes plus efficaces pour contrôler la génération d’images.

### Pondération des prompts

Le pondération des prompts (prompt weighting) offre une méthode quantifiable pour ajuster la représentation des concepts dans un prompt. Vous pouvez l’utiliser pour augmenter ou diminuer l’amplitude du vecteur d’embedding de texte pour chaque concept du prompt, ce qui détermine ensuite la proportion de chaque concept généré. La bibliothèque [Compel](https://github.com/damian0815/compel) propose une syntaxe intuitive pour ajuster les poids des prompts et générer les embeddings. Découvrez comment créer les embeddings dans le guide [Pondération des prompts](../using-diffusers/weighted_prompts).

Une fois que vous avez généré les embeddings, passez-les au paramètre `prompt_embeds` (et `negative_prompt_embeds` si vous utilisez un prompt négatif) dans [AutoPipelineForInpainting](/docs/diffusers/v0.43.0/fr/api/pipelines/auto_pipeline#diffusers.AutoPipelineForInpainting). Les embeddings remplacent le paramètre `prompt` :

```py
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import make_image_grid

pipeline = AutoPipelineForInpainting.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-inpainting", dtype=torch.float16,
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

image = pipeline(prompt_embeds=prompt_embeds, # generated from Compel
    negative_prompt_embeds=negative_prompt_embeds, # generated from Compel
    image=init_image,
    mask_image=mask_image
).images[0]
make_image_grid([init_image, mask_image, image], rows=1, cols=3)
```

### ControlNet

Les modèles ControlNet sont utilisés avec d'autres modèles de diffusion tels que Stable Diffusion, et ils offrent une méthode encore plus flexible et précise pour contrôler la génération d'une image. Un ControlNet accepte une image de conditionnement supplémentaire en entrée qui guide le modèle de diffusion afin de préserver les caractéristiques qu'elle contient.

Par exemple, conditionnons une image avec un ControlNet pré-entraîné sur des images d'inpainting :

```py
import torch
import numpy as np
from diffusers import ControlNetModel, StableDiffusionControlNetInpaintPipeline
from diffusers.utils import load_image, make_image_grid

# load ControlNet
controlnet = ControlNetModel.from_pretrained("lllyasviel/control_v11p_sd15_inpaint", dtype=torch.float16, variant="fp16")

# pass ControlNet to the pipeline
pipeline = StableDiffusionControlNetInpaintPipeline.from_pretrained(
    "stable-diffusion-v1-5/stable-diffusion-inpainting", controlnet=controlnet, dtype=torch.float16, variant="fp16"
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

# load base and mask image
init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint.png")
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/inpaint_mask.png")

# prepare control image
def make_inpaint_condition(init_image, mask_image):
    init_image = np.array(init_image.convert("RGB")).astype(np.float32) / 255.0
    mask_image = np.array(mask_image.convert("L")).astype(np.float32) / 255.0

    assert init_image.shape[0:1] == mask_image.shape[0:1], "image and image_mask must have the same image size"
    init_image[mask_image > 0.5] = -1.0  # set as masked pixel
    init_image = np.expand_dims(init_image, 0).transpose(0, 3, 1, 2)
    init_image = torch.from_numpy(init_image)
    return init_image

control_image = make_inpaint_condition(init_image, mask_image)
```

Générez maintenant une image à partir des images de base, de masque et de contrôle. Vous remarquerez que les caractéristiques de l'image de base sont fortement préservées dans l'image générée.

```py
prompt = "concept art digital painting of an elven castle, inspired by lord of the rings, highly detailed, 8k"
image = pipeline(prompt=prompt, image=init_image, mask_image=mask_image, control_image=control_image).images[0]
make_image_grid([init_image, mask_image, PIL.Image.fromarray(np.uint8(control_image[0][0])).convert('RGB'), image], rows=2, cols=2)
```

Vous pouvez aller plus loin et l’enchaîner avec un pipeline image-vers-image pour appliquer un nouveau [style](https://huggingface.co/nitrosocke/elden-ring-diffusion) :

```py
from diffusers import AutoPipelineForImage2Image

pipeline = AutoPipelineForImage2Image.from_pretrained(
    "nitrosocke/elden-ring-diffusion", dtype=torch.float16,
)
pipeline.enable_model_cpu_offload()
# remove following line if xFormers is not installed or you have PyTorch 2.0 or higher installed
pipeline.enable_xformers_memory_efficient_attention()

prompt = "elden ring style castle" # include the token "elden ring style" in the prompt
negative_prompt = "bad architecture, deformed, disfigured, poor details"

image_elden_ring = pipeline(prompt, negative_prompt=negative_prompt, image=image).images[0]
make_image_grid([init_image, mask_image, image, image_elden_ring], rows=2, cols=2)
```

  
    
    image initiale
  
  
    
    ControlNet inpaint
  
  
    
    image-vers-image
  

## Optimiser

Exécuter des modèles de diffusion peut être difficile et lent si vos ressources sont limitées, mais quelques astuces d’optimisation peuvent y remédier. L’une des optimisations les plus importantes (et les plus simples) à activer consiste à passer à une attention efficace en mémoire. Si vous utilisez PyTorch 2.0, [scaled-dot product attention](../optimization/fp16#scaled-dot-product-attention) est activée automatiquement et vous n’avez rien d’autre à faire. Pour les utilisateurs d’autres versions de PyTorch, vous pouvez installer et utiliser l’implémentation d’attention efficace en mémoire de [xFormers](../optimization/attention_backends). Les deux options réduisent l’utilisation de la mémoire et accélèrent l’inférence.

Vous pouvez également décharger le modèle sur le CPU pour économiser encore plus de mémoire :

```diff
+ pipeline.enable_xformers_memory_efficient_attention()
+ pipeline.enable_model_cpu_offload()
```

Pour accélérer encore davantage votre code d’inférence, utilisez [`torch_compile`](../optimization/fp16#torchcompile). Vous devez envelopper `torch.compile` autour du composant le plus intensif du pipeline, qui est généralement le UNet :

```py
pipeline.unet = torch.compile(pipeline.unet, mode="reduce-overhead", fullgraph=True)
```

En savoir plus dans les guides [Réduire l'utilisation de la mémoire](../optimization/memory) et [Accélérer l'inférence](../optimization/fp16).

