# RePaintScheduler

`RePaintScheduler` là trình lập lịch inpainting dựa trên DDPM cho inpainting không giám sát với các mask cực đoan. Nó được thiết kế để sử dụng cùng với `RePaintPipeline`, và dựa trên bài báo [RePaint: Inpainting using Denoising Diffusion Probabilistic Models](https://huggingface.co/papers/2201.09865) của Andreas Lugmayr và cộng sự.

Tóm tắt từ bài báo là:

*Inpainting dạng tự do là bài toán thêm nội dung mới vào một hình ảnh tại các vùng được chỉ định bởi một mặt nạ nhị phân tùy ý. Hầu hết các phương pháp hiện có được huấn luyện cho một phân bố mặt nạ nhất định, điều này hạn chế khả năng tổng quát hóa của chúng đối với các loại mặt nạ chưa từng thấy. Hơn nữa, việc huấn luyện với các tổn thất theo từng pixel và tổn thất nhận thức thường dẫn đến việc mở rộng kết cấu đơn giản về phía các vùng bị thiếu thay vì tạo ra nội dung có ý nghĩa ngữ nghĩa. Trong công việc này, chúng tôi đề xuất RePaint: một phương pháp inpainting dựa trên Mô hình Xác suất Khuếch tán Loại bỏ nhiễu (DDPM) có thể áp dụng ngay cả cho các mặt nạ cực đoan. Chúng tôi sử dụng một DDPM vô điều kiện đã được huấn luyện trước như là tiên nghiệm sinh. Để điều kiện hóa quá trình sinh, chúng tôi chỉ thay đổi các bước lặp ngược của quá trình khuếch tán bằng cách lấy mẫu các vùng không bị che mặt nạ bằng cách sử dụng thông tin hình ảnh đã cho. Vì kỹ thuật này không sửa đổi hoặc điều kiện hóa chính mạng DDPM gốc, mô hình tạo ra các hình ảnh đầu ra chất lượng cao và đa dạng cho bất kỳ dạng inpainting nào. Chúng tôi xác thực phương pháp của mình cho cả inpainting khuôn mặt và inpainting hình ảnh đa dụng bằng cách sử dụng các mặt nạ tiêu chuẩn và cực đoan. RePaint vượt trội hơn các phương pháp Autoregressive và GAN tiên tiến nhất cho ít nhất năm trong số sáu phân bố mặt nạ. Kho GitHub: [this http URL](http://git.io/RePaint).*

Bản triển khai gốc có thể được tìm thấy tại [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)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L99)

**Tham số:**

num_train_timesteps (`int`, mặc định là `1000`) : Số bước khuếch tán để huấn luyện mô hình.

beta_start (`float`, mặc định là `0.0001`) : Giá trị `beta` ban đầu của suy luận.

beta_end (`float`, mặc định là `0.02`) : Giá trị `beta` cuối cùng.

beta_schedule (`str`, mặc định là `"linear"`) : Lịch trình beta, một ánh xạ từ một khoảng beta sang một chuỗi các beta để bước qua mô hình. Chọn từ `linear`, `scaled_linear`, `squaredcos_cap_v2`, hoặc `sigmoid`.

eta (`float`, mặc định là `0.0`) : Trọng số của nhiễu được thêm vào trong một bước khuếch tán. Giá trị `0.0` tương ứng với DDIM và giá trị `1.0` tương ứng với DDPM.

trained_betas (`np.ndarray`, *tùy chọn*) : Truyền một mảng betas trực tiếp vào constructor để bỏ qua `beta_start` và `beta_end`.

clip_sample (`bool`, mặc định là `True`) : Cắt mẫu dự đoán trong khoảng từ -1 đến 1 để đảm bảo ổn định về mặt số học.

`RePaintScheduler` là một trình lập lịch cho việc inpainting DDPM bên trong một mask cho trước.

Mô hình này kế thừa từ [SchedulerMixin](/docs/diffusers/main/vi/api/schedulers/overview#diffusers.SchedulerMixin) và [ConfigMixin](/docs/diffusers/main/vi/api/configuration#diffusers.ConfigMixin). Xem tài liệu của lớp cha để biết các phương thức chung mà thư viện triển khai cho tất cả các scheduler, chẳng hạn như tải và lưu.

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

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

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L395)

**Tham số:**

original_samples (`torch.Tensor`) : Các mẫu gốc mà nhiễu sẽ được thêm vào.

noise (`torch.Tensor`) : Nhiễu sẽ được thêm vào các mẫu.

timesteps (`torch.IntTensor`) : Các bước thời gian (timesteps) sẽ xác định mức độ nhiễu cho từng mẫu.

**Gây ra:** ``NotImplementedError``

- ``NotImplementedError`` --  Huấn luyện RePaint nên sử dụng [DDPMScheduler.add_noise()](/docs/diffusers/main/vi/api/schedulers/ddpm#diffusers.DDPMScheduler.add_noise) thay thế.

Chỉ ra rằng việc thêm nhiễu cho quá trình huấn luyện RePaint không được hỗ trợ bởi trình lập lịch này.

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

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

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L171)

**Tham số:**

sample (`torch.Tensor`) : Mẫu đầu vào.

timestep (`int`, *tùy chọn*) : Bước thời gian hiện tại trong chuỗi khuếch tán.

**Trả về:** `torch.Tensor`

Một mẫu đầu vào đã được chuẩn hóa.

Đảm bảo khả năng hoán đổi với các trình lập lịch cần mở rộng đầu vào của mô hình khử nhiễu tùy thuộc vào bước thời gian hiện tại.

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

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L188)

**Tham số:**

num_inference_steps (`int`) : Số bước khuếch tán được sử dụng khi tạo mẫu bằng một mô hình đã được huấn luyện trước.

jump_length (`int`, mặc định là `10`) : Số bước tiến về phía trước trong thời gian trước khi quay ngược thời gian cho một lần nhảy duy nhất (“j” trong bài báo RePaint). Hãy xem Hình 9 và 10 trong bài báo.

jump_n_sample (`int`, mặc định là `10`) : Số lần thực hiện bước nhảy thời gian tiến cho một mẫu thời gian được chọn. Hãy xem Hình 9 và 10 trong bài báo.

device (`str` hoặc `torch.device`, *tuỳ chọn*) : Thiết bị mà các bước thời gian (timesteps) sẽ được chuyển đến. Nếu là `None`, các bước thời gian sẽ không được chuyển.

Đặt các bước thời gian rời rạc được sử dụng cho chuỗi khuếch tán (cần chạy trước khi suy luận).

#### bước[[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)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L264)

**Tham số:**

model_output (`torch.Tensor`) : Đầu ra trực tiếp từ mô hình khuếch tán đã học.

timestep (`int`) : Bước thời gian rời rạc hiện tại trong chuỗi khuếch tán.

sample (`torch.Tensor`) : Một bản sao mẫu hiện tại được tạo ra bởi quá trình khuếch tán.

original_image (`torch.Tensor`) : Ảnh gốc để thực hiện inpaint.

mask (`torch.Tensor`) : Mặt nạ mà giá trị 0.0 chỉ ra phần của ảnh gốc cần được inpaint.

generator (`torch.Generator`, *tùy chọn*) : Bộ tạo số ngẫu nhiên.

return_dict (`bool`, mặc định là `True`) : Có nên trả về một [RePaintSchedulerOutput](/docs/diffusers/main/vi/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) thay vì một tuple hay không.

**Trả về:** [RePaintSchedulerOutput](/docs/diffusers/main/vi/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) hoặc `tuple[torch.Tensor, torch.Tensor]`

If return_dict is `True`, [RePaintSchedulerOutput](/docs/diffusers/main/vi/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.

Dự đoán mẫu từ bước thời gian trước đó bằng cách đảo ngược SDE. Hàm này lan truyền quá trình khuếch tán từ các đầu ra của mô hình đã học (thường nhất là nhiễu được dự đoán).

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

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

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L358)

**Tham số:**

sample (`torch.Tensor`) : Mẫu mà nhiễu được thêm vào.

timestep (`int`) : Bước thời gian rời rạc hiện tại trong chuỗi khuếch tán.

generator (`torch.Generator`, *tùy chọn*) : Bộ tạo số ngẫu nhiên.

**Trả về:** `torch.Tensor`

Mẫu tại bước thời gian tiếp theo trong chuỗi khuếch tán.

Thêm nhiễu vào một mẫu để di chuyển nó tiến lên một bước khuếch tá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)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_repaint.py#L29)

**Tham số:**

prev_sample (`torch.Tensor` có shape `(batch_size, num_channels, height, width)` đối với ảnh) : Mẫu đã tính (x_{t-1}) của bước thời gian trước đó. `prev_sample` nên được sử dụng làm đầu vào mô hình tiếp theo trong vòng lặp khử nhiễu.

pred_original_sample (`torch.Tensor` có shape `(batch_size, num_channels, height, width)` đối với ảnh) : Mẫu khử nhiễu dự đoán (x_{0}) dựa trên đầu ra của mô hình tại bước thời gian hiện tại. `pred_original_sample` có thể được dùng để xem trước tiến độ hoặc cho guidance.

Lớp đầu ra cho kết quả của hàm bước của trình lập lịch.

