# RePaintScheduler

`RePaintScheduler` es un programador de inpainting basado en DDPM para inpainting no supervisado con máscaras extremas. Está diseñado para usarse con `RePaintPipeline` y se basa en el artículo [RePaint: Inpainting using Denoising Diffusion Probabilistic Models](https://huggingface.co/papers/2201.09865) de Andreas Lugmayr et al.

El resumen del artículo es:

*El inpainting libre es la tarea de añadir nuevo contenido a una imagen en las regiones especificadas por una máscara binaria arbitraria. La mayoría de los enfoques existentes se entrenan para una cierta distribución de máscaras, lo que limita su capacidad de generalización a tipos de máscaras no vistos. Además, el entrenamiento con pérdidas a nivel de píxel y perceptuales a menudo conduce a extensiones texturales simples hacia las áreas faltantes en lugar de una generación semánticamente significativa. En este trabajo, proponemos RePaint: un enfoque de inpainting basado en un Modelo Probabilístico de Difusión con Ruido (DDPM) que es aplicable incluso a máscaras extremas. Empleamos un DDPM incondicional preentrenado como prior generativo. Para condicionar el proceso de generación, solo alteramos las iteraciones de difusión inversa muestreando las regiones no enmascaradas usando la información de la imagen dada. Dado que esta técnica no modifica ni condiciona la red DDPM original en sí, el modelo produce imágenes de salida de alta calidad y diversas para cualquier forma de inpainting. Validamos nuestro método tanto para inpainting de rostros como para inpainting de imágenes de uso general, utilizando máscaras estándar y extremas. RePaint supera a los enfoques Autoregressive y GAN del estado del arte para al menos cinco de las seis distribuciones de máscaras. Repositorio de GitHub: [esta URL http](http://git.io/RePaint).*

La implementación original se puede encontrar en [andreas128/RePaint](https://github.com/andreas128/).

## RePaintScheduler[[diffusers.RePaintScheduler]]

#### diffusers.RePaintScheduler[[diffusers.RePaintScheduler]]

```python
diffusers.RePaintScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.0001, beta_end: float = 0.02, beta_schedule: str = 'linear', eta: float = 0.0, trained_betas: numpy.ndarray | None = None, clip_sample: bool = True)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_repaint.py#L99)

**Parámetros:**

num_train_timesteps (`int`, por defecto `1000`) : El número de pasos de difusión para entrenar el modelo.

beta_start (`float`, por defecto `0.0001`) : El valor inicial de `beta` para la inferencia.

beta_end (`float`, por defecto `0.02`) : El valor final de `beta`.

beta_schedule (`str`, por defecto `"linear"`) : La programación de beta, un mapeo desde un rango de beta hasta una secuencia de betas para dar pasos al modelo. Elija entre `linear`, `scaled_linear`, `squaredcos_cap_v2` o `sigmoid`.

eta (`float`, por defecto `0.0`) : El peso del ruido añadido durante un paso de difusión. Un valor de `0.0` corresponde a DDIM y un valor de `1.0` corresponde a DDPM.

trained_betas (`np.ndarray`, *opcional*) : Pasa un array de betas directamente al constructor para omitir `beta_start` y `beta_end`.

clip_sample (`bool`, por defecto `True`) : Recorta la muestra predicha entre -1 y 1 para la estabilidad numérica.

`RePaintScheduler` es un programador para el inpainting de DDPM dentro de una máscara dada.

Este modelo hereda de [SchedulerMixin](/docs/diffusers/v0.43.0/es/api/schedulers/overview#diffusers.SchedulerMixin) y [ConfigMixin](/docs/diffusers/v0.43.0/es/api/configuration#diffusers.ConfigMixin). Consulta la documentación de la clase superior para los métodos genéricos que la biblioteca implementa para todos los programadores, como la carga y el guardado.

#### add_noise[[diffusers.RePaintScheduler.add_noise]]

```python
add_noise(original_samples: Tensor, noise: Tensor, timesteps: IntTensor)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_repaint.py#L395)

**Parámetros:**

original_samples (`torch.Tensor`) : Las muestras originales a las que se añadiría ruido.

noise (`torch.Tensor`) : El ruido que se añadiría a las muestras.

timesteps (`torch.IntTensor`) : Los pasos de tiempo que determinarían el nivel de ruido para cada muestra.

**Excepciones:** ``NotImplementedError``

- ``NotImplementedError`` -- El entrenamiento de RePaint debería usar [DDPMScheduler.add_noise()](/docs/diffusers/v0.43.0/es/api/schedulers/ddpm#diffusers.DDPMScheduler.add_noise) en su lugar.

Indique que la adición de ruido para el entrenamiento de RePaint no es compatible con este programador.

#### scale_model_input[[diffusers.RePaintScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, timestep: int | None = None)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_repaint.py#L171)

**Parámetros:**

sample (`torch.Tensor`) : La muestra de entrada.

timestep (`int`, *opcional*) : El paso temporal actual en la cadena de difusión.

**Devuelve:** `torch.Tensor`

Una muestra de entrada escalada.

Garantiza la interoperabilidad con los programadores que necesitan escalar la entrada del modelo de desruido en función del paso temporal actual.

#### set_timesteps[[diffusers.RePaintScheduler.set_timesteps]]

```python
set_timesteps(num_inference_steps: int, jump_length: int = 10, jump_n_sample: int = 10, device: typing.Union[str, torch.device, NoneType] = None)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_repaint.py#L188)

**Parámetros:**

num_inference_steps (`int`) : El número de pasos de difusión utilizados al generar muestras con un modelo preentrenado.

jump_length (`int`, por defecto `10`) : El número de pasos que se realizan hacia adelante en el tiempo antes de retroceder en el tiempo para un solo salto (“j” en el artículo de RePaint). Consulte las figuras 9 y 10 del artículo.

jump_n_sample (`int`, por defecto `10`) : El número de veces que se realiza un salto temporal hacia adelante para una muestra de tiempo elegida. Consulte las figuras 9 y 10 del artículo.

device (`str` o `torch.device`, *opcional*) : El dispositivo al que deben moverse los pasos de tiempo. Si es `None`, los pasos de tiempo no se mueven.

Establece los pasos discretos utilizados para la cadena de difusión (para ejecutarse antes de la inferencia).

#### paso[[diffusers.RePaintScheduler.step]]

```python
step(model_output: Tensor, timestep: int, sample: Tensor, original_image: Tensor, mask: Tensor, generator: typing.Optional[torch.Generator] = None, return_dict: bool = True)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_repaint.py#L264)

**Parámetros:**

model_output (`torch.Tensor`) : La salida directa del modelo de difusión aprendido.

timestep (`int`) : El paso de tiempo discreto actual en la cadena de difusión.

sample (`torch.Tensor`) : Una instancia actual de una muestra creada por el proceso de difusión.

original_image (`torch.Tensor`) : La imagen original sobre la que se realizará el inpainting.

mask (`torch.Tensor`) : La máscara donde un valor de 0.0 indica qué parte de la imagen original se debe inpaint.

generator (`torch.Generator`, *opcional*) : Un generador de números aleatorios.

return_dict (`bool`, por defecto `True`) : Si se debe devolver una [RePaintSchedulerOutput](/docs/diffusers/v0.43.0/es/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) en lugar de una tupla.

**Devuelve:** [RePaintSchedulerOutput](/docs/diffusers/v0.43.0/es/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) o `tuple[torch.Tensor, torch.Tensor]`

Si return_dict es `True`, se devuelve [RePaintSchedulerOutput](/docs/diffusers/v0.43.0/es/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput); en caso contrario, se devuelve una tupla cuyo primer elemento es la muestra anterior y el segundo es la muestra original predicha.

Predice la muestra del paso de tiempo anterior invirtiendo el SDE. Esta función propaga el proceso de difusión desde las salidas del modelo aprendido (con mayor frecuencia, el ruido predicho).

#### undo_step[[diffusers.RePaintScheduler.undo_step]]

```python
undo_step(sample: Tensor, timestep: int, generator: typing.Optional[torch.Generator] = None)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_repaint.py#L358)

**Parámetros:**

sample (`torch.Tensor`) : La muestra a la que se le añade ruido.

timestep (`int`) : El paso de tiempo discreto actual en la cadena de difusión.

generator (`torch.Generator`, *opcional*) : Un generador de números aleatorios.

**Devuelve:** `torch.Tensor`

La muestra en el siguiente paso de tiempo de la cadena de difusión.

Añada ruido a una muestra para avanzar un paso de difusión.

## RePaintSchedulerOutput[[diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput]]

#### diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput[[diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput]]

```python
diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput(prev_sample: Tensor, pred_original_sample: Tensor)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_repaint.py#L29)

**Parámetros:**

prev_sample (`torch.Tensor` de forma `(batch_size, num_channels, height, width)` para imágenes) : Muestra calculada (x_{t-1}) del paso de tiempo anterior. `prev_sample` debe usarse como entrada del modelo en el siguiente paso del bucle de desruido.

pred_original_sample (`torch.Tensor` de forma `(batch_size, num_channels, height, width)` para imágenes) : La muestra desruidada predicha (x_{0}) basada en la salida del modelo del paso de tiempo actual. `pred_original_sample` se puede usar para previsualizar el progreso o para la guía.

Clase de salida para la función de paso del programador.

