# RePaintScheduler

`RePaintScheduler` は、極端なマスクを用いた教師なしインペインティングのための DDPM ベースのインペインティングスケジューラーです。`RePaintPipeline` と組み合わせて使用することを前提として設計されており、Andreas Lugmayr らによる論文 [RePaint: Inpainting using Denoising Diffusion Probabilistic Models](https://huggingface.co/papers/2201.09865) に基づいています。

論文の抄録は以下の通りです：

*フリーフォームインペインティングとは、任意のバイナリマスクで指定された領域に新しいコンテンツを追加するタスクです。既存の多くのアプローチは特定のマスク分布に対して学習されるため、未見のマスクタイプへの汎化能力が制限されます。さらに、ピクセル単位および知覚損失を用いた学習では、意味のある生成ではなく、欠損領域へ向かって単純なテクスチャの拡張が生じることがよくあります。本稿では、RePaintを提案します。これは、極端なマスクにも適用可能な、DDPM（デノイジング拡散確率モデル）に基づくインペインティング手法です。生成事前分布として、事前学習済みの無条件DDPMを用います。生成過程を条件付けするために、与えられた画像情報を用いてマスクされていない領域をサンプリングすることにより、逆拡散イテレーションのみを変更します。この手法は元のDDPMネットワーク自体を変更したり条件付けたりしないため、モデルはあらゆるインペインティング形式に対して高品質かつ多様な出力画像を生成します。標準的なマスクと極端なマスクを用いて、顔および汎用画像インペインティングの両方について本手法を検証しました。RePaintは、6つのマスク分布のうち少なくとも5つにおいて、最先端の自己回帰型および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`は、指定されたマスク内でDDPMインペインティングを行うためのスケジューラーです。

このモデルは [SchedulerMixin](/docs/diffusers/main/ja/api/schedulers/overview#diffusers.SchedulerMixin) と [ConfigMixin](/docs/diffusers/main/ja/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/ja/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`) : 単一のジャンプ（RePaint論文における「j」）において、過去へ戻る前に時間軸上で前方へ進むステップ数です。論文のFigure 9およびFigure 10を参照してください。

jump_n_sample (`int`、デフォルトは`10`) : 選択された時間サンプルに対して、フォワードタイムジャンプを行う回数です。論文の図9と図10を参照してください。

device (`str` または `torch.device`、*任意*) : timesteps を移動先とするデバイスです。`None` の場合、timesteps は移動されません。

拡散チェーンで使用される離散タイムステップを設定します（推論の実行前に実行する必要があります）。

#### ステップ[[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/ja/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput)を返すかどうか。

**戻り値:** [RePaintSchedulerOutput](/docs/diffusers/main/ja/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) または `tuple[torch.Tensor, torch.Tensor]`

`True` の場合、[RePaintSchedulerOutput](/docs/diffusers/main/ja/api/schedulers/repaint#diffusers.schedulers.scheduling_repaint.RePaintSchedulerOutput) が返され、それ以外の場合は、最初の要素が前のサンプル、2番目の要素が予測された元のサンプルであるタプルが返されます。

前回のタイムステップからのサンプルを、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`

拡散チェーンにおける次のタイムステップのサンプル。

サンプリングにノイズを加え、拡散ステップを1ステップ進めます。

## 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` は、進捗のプレビューやガイダンスに使用できます。

スケジューラーのステップ関数の出力用の出力クラス。

