# RePaintScheduler

`RePaintScheduler` adalah scheduler inpainting berbasis DDPM untuk inpainting tanpa pengawasan dengan mask ekstrem. Scheduler ini dirancang untuk digunakan bersama `RePaintPipeline`, dan didasarkan pada makalah [RePaint: Inpainting using Denoising Diffusion Probabilistic Models](https://huggingface.co/papers/2201.09865) oleh Andreas Lugmayr dkk.

Abstrak dari makalah tersebut adalah:

*Inpainting bebas bentuk adalah tugas menambahkan konten baru ke dalam gambar pada wilayah yang ditentukan oleh mask biner arbitrer. Sebagian besar pendekatan yang ada dilatih untuk distribusi mask tertentu, yang membatasi kemampuan generalisasinya terhadap jenis mask yang belum pernah dilihat. Selain itu, pelatihan dengan kerugian piksel-ke-piksel dan perseptual sering kali menghasilkan ekstensi tekstural sederhana ke arah area yang hilang, bukan generasi yang bermakna secara semantik. Dalam karya ini, kami mengusulkan RePaint: pendekatan inpainting berbasis Model Probabilistik Difusi Denoising (DDPM) yang dapat diterapkan bahkan pada mask ekstrem. Kami menggunakan DDPM tak bersyarat yang telah dilatih sebelumnya sebagai prior generatif. Untuk mengondisikan proses generasi, kami hanya mengubah iterasi difusi terbalik dengan mengambil sampel wilayah yang tidak dimask menggunakan informasi gambar yang diberikan. Karena teknik ini tidak memodifikasi atau mengondisikan jaringan DDPM aslinya, model menghasilkan gambar keluaran berkualitas tinggi dan beragam untuk bentuk inpainting apa pun. Kami memvalidasi metode kami untuk inpainting wajah dan gambar umum menggunakan mask standar dan ekstrem. RePaint melampaui pendekatan Autoregressive dan GAN terkini untuk setidaknya lima dari enam distribusi mask. Repositori GitHub: [this http URL](http://git.io/RePaint).*

Implementasi asli dapat ditemukan di [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)
```

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

**Parameter:**

num_train_timesteps (`int`, defaultnya `1000`) : Jumlah langkah difusi untuk melatih model.

beta_start (`float`, defaultnya `0.0001`) : Nilai awal `beta` untuk inferensi.

beta_end (`float`, defaultnya `0.02`) : Nilai `beta` akhir.

beta_schedule (`str`, defaultnya `"linear"`) : Jadwal beta, pemetaan dari rentang beta ke urutan beta untuk melangkah model. Pilih dari `linear`, `scaled_linear`, `squaredcos_cap_v2`, atau `sigmoid`.

eta (`float`, defaultnya `0.0`) : Bobot noise yang ditambahkan selama langkah difusi. Nilai `0.0` sesuai dengan DDIM dan nilai `1.0` sesuai dengan DDPM.

trained_betas (`np.ndarray`, *opsional*) : Lewatkan `beta_start` dan `beta_end` dengan meneruskan array betas secara langsung ke konstruktor.

clip_sample (`bool`, defaultnya `True`) : Memotong sampel prediksi antara -1 dan 1 untuk stabilitas numerik.

`RePaintScheduler` adalah scheduler untuk inpainting DDPM di dalam mask yang diberikan.

Model ini mewarisi dari [SchedulerMixin](/docs/diffusers/v0.43.0/id/api/schedulers/overview#diffusers.SchedulerMixin) dan [ConfigMixin](/docs/diffusers/v0.43.0/id/api/configuration#diffusers.ConfigMixin). Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan pustaka ini untuk semua scheduler, seperti pemuatan dan penyimpanan.

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

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

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

**Parameter:**

original_samples (`torch.Tensor`) : Sampel asli yang akan ditambahkan dengan noise.

noise (`torch.Tensor`) : Kebisingan yang akan ditambahkan ke sampel.

timesteps (`torch.IntTensor`) : Langkah waktu yang akan menentukan tingkat noise untuk setiap sampel.

**Mengangkat:** ``NotImplementedError``

- ``NotImplementedError`` -- Pelatihan RePaint seharusnya menggunakan [DDPMScheduler.add_noise()](/docs/diffusers/v0.43.0/id/api/schedulers/ddpm#diffusers.DDPMScheduler.add_noise) sebagai gantinya.

Tunjukkan bahwa penambahan noise untuk pelatihan RePaint tidak didukung oleh scheduler ini.

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

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

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

**Parameter:**

sample (`torch.Tensor`) : Sampel input.

timestep (`int`, *opsional*) : Langkah waktu (timestep) saat ini dalam rantai difusi.

**Mengembalikan:** `torch.Tensor`

Contoh input yang diskalakan.

Memastikan interoperabilitas dengan scheduler yang perlu menskalakan input model denoising berdasarkan timestep saat ini.

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

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

**Parameter:**

num_inference_steps (`int`) : Jumlah langkah difusi yang digunakan saat menghasilkan sampel dengan model terlatih sebelumnya.

jump_length (`int`, defaultnya `10`) : Jumlah langkah yang diambil maju dalam waktu sebelum mundur dalam waktu untuk satu lompatan (“j” dalam paper RePaint). Lihat Gambar 9 dan 10 dalam paper tersebut.

jump_n_sample (`int`, defaultnya `10`) : Jumlah kali lompatan waktu ke depan yang dilakukan untuk sampel waktu tertentu. Lihat Gambar 9 dan 10 di makalah tersebut.

device (`str` atau `torch.device`, *opsional*) : Perangkat tempat timestep harus dipindahkan. Jika `None`, timestep tidak dipindahkan.

Menetapkan langkah waktu diskrit yang digunakan untuk rantai difusi (untuk dijalankan sebelum inferensi).

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

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

**Parameter:**

model_output (`torch.Tensor`) : Output langsung dari model difusi yang telah dipelajari.

timestep (`int`) : Langkah waktu diskret saat ini dalam rantai difusi.

sample (`torch.Tensor`) : Instans saat ini dari sampel yang dibuat oleh proses difusi.

original_image (`torch.Tensor`) : Gambar asli untuk di-inpaint.

mask (`torch.Tensor`) : Mask di mana nilai 0.0 menunjukkan bagian dari gambar asli yang akan di-inpaint.

generator (`torch.Generator`, *opsional*) : Generator angka acak.

return_dict (`bool`, defaultnya `True`) : Apakah akan mengembalikan [RePaintSchedulerOutput](/docs/diffusers/v0.43.0/id/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) alih-alih tuple.

**Mengembalikan:** [RePaintSchedulerOutput](/docs/diffusers/v0.43.0/id/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) atau `tuple[torch.Tensor, torch.Tensor]`

Jika return_dict adalah `True`, [RePaintSchedulerOutput](/docs/diffusers/v0.43.0/id/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) dikembalikan, selain itu sebuah tuple dikembalikan di mana elemen pertama adalah sampel sebelumnya dan elemen kedua adalah sampel asli yang diprediksi.

Prediksi sampel dari langkah waktu sebelumnya dengan membalik SDE. Fungsi ini menyebarkan proses difusi dari keluaran model yang dipelajari (paling sering berupa noise yang diprediksi).

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

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

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

**Parameter:**

sample (`torch.Tensor`) : Sampel yang ditambahkan dengan noise.

timestep (`int`) : Langkah waktu diskret saat ini dalam rantai difusi.

generator (`torch.Generator`, *opsional*) : Generator angka acak.

**Mengembalikan:** `torch.Tensor`

Contoh pada langkah waktu berikutnya dalam rantai difusi.

Tambahkan noise ke sampel untuk menggerakkannya maju satu langkah difusi.

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

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

**Parameter:**

prev_sample (`torch.Tensor` dengan bentuk `(batch_size, num_channels, height, width)` untuk gambar) : Sampel yang dihitung (x_{t-1}) dari timestep sebelumnya. `prev_sample` harus digunakan sebagai input model berikutnya dalam loop denoising.

pred_original_sample (`torch.Tensor` dengan bentuk `(batch_size, num_channels, height, width)` untuk gambar) : Sampel denoised (x_{0}) yang diprediksi berdasarkan output model dari timestep saat ini. `pred_original_sample` dapat digunakan untuk pratinjau progres atau untuk guidance.

Kelas output untuk output fungsi langkah penjadwal.

