# RePaintScheduler

`RePaintScheduler` — это планировщик инпейнтинга на основе DDPM для инпейнтинга без обучения с экстремальными масками. Он предназначен для использования с `RePaintPipeline` и основан на статье [RePaint: Inpainting using Denoising Diffusion Probabilistic Models](https://huggingface.co/papers/2201.09865) Андреаса Лугмайра и соавторов.

Аннотация из статьи:

*Свободное инпейнтинг (восстановление изображений) — это задача добавления нового содержимого на изображение в областях, заданных произвольной бинарной маской. Большинство существующих подходов обучаются на определённом распределении масок, что ограничивает их способность к обобщению на невиденные типы масок. Кроме того, обучение с использованием поэлементных и перцептивных потерь часто приводит к простому текстуальному расширению в сторону отсутствующих областей, а не к семантически осмысленной генерации. В данной работе мы предлагаем RePaint: подход к инпейнтингу на основе вероятностной модели диффузионного шумоподавления (DDPM), применимый даже к экстремальным маскам. Мы используем предобученную безусловную DDPM в качестве генеративного априорного распределения. Для обусловливания процесса генерации мы изменяем только итерации обратной диффузии, сэмплируя немаскированные области с использованием информации из данного изображения. Поскольку эта техника не модифицирует и не обусловливает саму исходную сеть DDPM, модель генерирует изображения высокого качества и разнообразия для любой формы инпейнтинга. Мы проверяем наш метод как для лиц, так и для общего инпейнтинга изображений, используя стандартные и экстремальные маски. RePaint превосходит передовые авто регрессионные и GAN-подходы как минимум для пяти из шести распределений масок. Репозиторий на GitHub: [этот http URL](http://git.io/RePaint).*

Оригинальная реализация доступна по адресу [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)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L99)

**Параметры:**

num_train_timesteps (`int`, по умолчанию `1000`) : Количество шагов диффузии для обучения модели.

beta_start (`float`, по умолчанию `0.0001`) : начальное значение `beta` для инференса.

beta_end (`float`, по умолчанию `0.02`) : Итоговое значение `beta`.

beta_schedule (`str`, по умолчанию `"linear"`) : Расписание бета, отображающее диапазон значений бета в последовательность бета для шагов модели. Выберите одно из значений: `linear`, `scaled_linear`, `squaredcos_cap_v2` или `sigmoid`.

eta (`float`, по умолчанию `0.0`) : Вес шума, добавляемого на шаге диффузии. Значение `0.0` соответствует DDIM, а значение `1.0` — DDPM.

trained_betas (`np.ndarray`, *необязательный*) : Передайте массив бета непосредственно в конструктор, чтобы обойти `beta_start` и `beta_end`.

clip_sample (`bool`, по умолчанию `True`) : Ограничивает предсказанную выборку значениями от -1 до 1 для численной стабильности.

`RePaintScheduler` — это планировщик для inpainting DDPM внутри заданной маски.

Эта модель наследуется от [SchedulerMixin](/docs/diffusers/main/ru/api/schedulers/overview#diffusers.SchedulerMixin) и [ConfigMixin](/docs/diffusers/main/ru/api/configuration#diffusers.ConfigMixin). Общие методы, которые библиотека реализует для всех планировщиков, такие как загрузка и сохранение, описаны в документации суперкласса.

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

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

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L395)

**Параметры:**

original_samples (`torch.Tensor`) : исходные образцы, к которым будет добавлен шум.

noise (`torch.Tensor`) : Шум, который будет добавлен к выборкам.

timesteps (`torch.IntTensor`) : Шаги, определяющие уровень шума для каждого примера.

**Исключения:** ``NotImplementedError``

- ``NotImplementedError`` -- Обучение RePaint следует использовать [DDPMScheduler.add_noise()](/docs/diffusers/main/ru/api/schedulers/ddpm#diffusers.DDPMScheduler.add_noise) вместо этого.

Укажите, что добавление шума для обучения RePaint не поддерживается этим планировщиком.

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

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

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L171)

**Параметры:**

sample (`torch.Tensor`) : Входной образец.

timestep (`int`, *необязательный*) : Текущий шаг в цепочке диффузии.

**Возвращает:** `torch.Tensor`

Масштабированный входной образец.

Обеспечивает совместимость с планировщиками, которым необходимо масштабировать входную модель денуазинга в зависимости от текущего шага.

#### 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)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L188)

**Параметры:**

num_inference_steps (`int`) : Количество шагов диффузии, используемое при генерации образцов с помощью предобученной модели.

jump_length (`int`, по умолчанию `10`) : Количество шагов, выполняемых вперёд во времени перед откатом назад для одного прыжка («j» в статье RePaint). См. рисунки 9 и 10 в статье.

jump_n_sample (`int`, по умолчанию `10`) : Количество раз, когда выполняется скачок во времени вперёд для выбранного временного сэмпла. См. рисунки 9 и 10 в статье.

device (`str` или `torch.device`, *необязательный*) : Устройство, на которое следует переместить шаги. Если `None`, шаги не перемещаются.

Устанавливает дискретные временные шаги, используемые для цепочки диффузии (выполняется перед инференсом).

#### шаг[[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)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L264)

**Параметры:**

model_output (`torch.Tensor`) : Прямой вывод из обученной диффузионной модели.

timestep (`int`) : Текущий дискретный шаг времени в цепочке диффузии.

sample (`torch.Tensor`) : Текущая инстанция сэмпла, созданная процессом диффузии.

original_image (`torch.Tensor`) : Исходное изображение, на котором выполняется инпейнт.

mask (`torch.Tensor`) : маска, в которой значение 0.0 указывает, какую часть исходного изображения необходимо восстановить.

generator (`torch.Generator`, *необязательный*) : генератор случайных чисел.

return_dict (`bool`, по умолчанию `True`) : Возвращать ли [RePaintSchedulerOutput](/docs/diffusers/main/ru/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) вместо кортежа.

**Возвращает:** [RePaintSchedulerOutput](/docs/diffusers/main/ru/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) или `tuple[torch.Tensor, torch.Tensor]`

If return_dict is `True`, [RePaintSchedulerOutput](/docs/diffusers/main/ru/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) is returned, otherwise a tuple is returned where the first element is the previous sample and the second is the predicted original sample.

Предскажите образец из предыдущего шага времени, обращая SDE. Эта функция распространяет процесс диффузии от выходов обученной модели (чаще всего — предсказанного шума).

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

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

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L358)

**Параметры:**

sample (`torch.Tensor`) : Образец, к которому добавляется шум.

timestep (`int`) : Текущий дискретный шаг времени в цепочке диффузии.

generator (`torch.Generator`, *необязательный*) : генератор случайных чисел.

**Возвращает:** `torch.Tensor`

Образец на следующем шаге времени в цепочке диффузии.

Добавьте шум к образцу, чтобы сдвинуть его на один шаг диффузии вперёд.

## 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)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L29)

**Параметры:**

prev_sample (`torch.Tensor` формы `(batch_size, num_channels, height, width)` для изображений) : Вычисленная выборка (x_{t-1}) для предыдущего шага. `prev_sample` следует использовать как следующий вход модели в цикле шумоподавления.

pred_original_sample (`torch.Tensor` формы `(batch_size, num_channels, height, width)` для изображений) : Предсказанный денойзированный образец (x_{0}) на основе вывода модели из текущего шага. `pred_original_sample` можно использовать для предпросмотра прогресса или для направленного генерирования.

Класс для вывода функции шага планировщика.

