# DDIM

Jiaming Song, Chenlin Meng, Stefano Ermon의 [Denoising Diffusion Implicit Models](https://huggingface.co/papers/2010.02502)(DDIM).

해당 논문의 초록은 다음과 같습니다:

*디노이징 확산 확률 모델(DDPM)은 적대적 학습 없이 고품질 이미지 생성을 달성했지만, 샘플을 생성하려면 마르코프 체인을 여러 단계에 걸쳐 시뮬레이션해야 합니다. 샘플링을 가속화하기 위해, 우리는 DDPM과 동일한 학습 절차를 가지며 더 효율적인 반복적 암시적 확률 모델 클래스인 디노이징 확산 암시적 모델(DDIM)을 제시합니다. DDPM에서 생성 과정은 마르코프 확산 과정의 역과정으로 정의됩니다. 우리는 동일한 학습 목적 함수를 유도하지만, 그 역과정에서 샘플링 속도가 훨씬 더 빠를 수 있는 비마르코프 확산 과정 클래스를 구성합니다. 우리는 DDIM이 DDPM에 비해 실제 시간 기준 10배에서 50배 더 빠르게 고품질 샘플을 생성할 수 있음을 경험적으로 입증했으며, 이는 계산량과 샘플 품질 간의 트레이드오프를 허용하고, 잠재 공간에서 의미론적으로 의미 있는 이미지 보간을 직접 수행할 수 있음을 보여줍니다.*

원본 코드베이스는 [ermongroup/ddim](https://github.com/ermongroup/ddim)에서 찾을 수 있습니다.

## DDIMPipeline[[diffusers.DDIMPipeline]]

#### diffusers.DDIMPipeline[[diffusers.DDIMPipeline]]

```python
diffusers.DDIMPipeline(unet: UNet2DModel, scheduler: DDIMScheduler)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/ddim/pipeline_ddim.py#L37)

**매개변수:**

unet ([UNet2DModel](/docs/diffusers/main/ko/api/models/unet2d#diffusers.UNet2DModel)) : 인코딩된 이미지 latents의 노이즈를 제거하기 위한 `UNet2DModel`입니다.

scheduler ([SchedulerMixin](/docs/diffusers/main/ko/api/schedulers/overview#diffusers.SchedulerMixin)) : `unet`와 함께 사용되어 인코딩된 이미지의 노이즈를 제거하는 스케줄러입니다. [DDPMScheduler](/docs/diffusers/main/ko/api/schedulers/ddpm#diffusers.DDPMScheduler) 또는 [DDIMScheduler](/docs/diffusers/main/ko/api/schedulers/ddim#diffusers.DDIMScheduler) 중 하나를 사용할 수 있습니다.

이미지 생성을 위한 Pipeline.

이 모델은 [DiffusionPipeline](/docs/diffusers/main/ko/api/pipelines/overview#diffusers.DiffusionPipeline)에서 상속됩니다. 모든 파이프라인에 대해 구현된 일반적 메서드(다운로드, 저장, 특정 디바이스에서 실행 등)에 대해서는 상위 클래스 문서를 확인하세요.

#### __호출__[[diffusers.DDIMPipeline.__call__]]

```python
__call__(batch_size: int = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, eta: float = 0.0, num_inference_steps: int = 50, use_clipped_model_output: bool | None = None, output_type: str | None = 'pil', return_dict: bool = True)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/ddim/pipeline_ddim.py#L62)

**매개변수:**

batch_size (`int`, *선택 사항*, 기본값 1) : 생성할 이미지의 수.

generator (`torch.Generator`, *선택 사항*) : 생성을 결정적으로 만들기 위한 [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html)입니다.

eta (`float`, *선택 사항*, 기본값 0.0) : [DDIM](https://huggingface.co/papers/2010.02502) 논문에서 정의된 파라미터 eta (η)에 해당합니다. [DDIMScheduler](/docs/diffusers/main/ko/api/schedulers/ddim#diffusers.DDIMScheduler)에만 적용되며, 다른 스케줄러에서는 무시됩니다. `0` 값은 DDIM을, `1` 값은 DDPM을 나타냅니다.

num_inference_steps (`int`, *선택 사항*, 기본값 50) : 디노이징 단계의 수입니다. 디노이징 단계가 많을수록 일반적으로 추론 속도가 느려지는 대신 더 높은 품질의 이미지를 생성합니다.

use_clipped_model_output (`bool`, *선택 사항*, 기본값 `None`) : `True` 또는 `False`인 경우 [DDIMScheduler.step()](/docs/diffusers/main/ko/api/schedulers/ddim#diffusers.DDIMScheduler.step)의 문서를 참조하세요. `None`인 경우 스케줄러에 아무것도 전달되지 않습니다(이 인수를 지원하지 않는 스케줄러에는 `None`을 사용하세요).

output_type (`str`, *선택 사항*, 기본값 `"pil"`) : 생성된 이미지의 출력 형식입니다. `"pil"` (`PIL.Image`), `"np"` (`np.array`) 또는 `"pt"` (`torch.Tensor`) 중 하나를 선택할 수 있습니다.

return_dict (`bool`, *선택 사항*, 기본값 `True`) : 일반 튜플 대신 [ImagePipelineOutput](/docs/diffusers/main/ko/api/pipelines/consistency_models#diffusers.ImagePipelineOutput)을 반환할지 여부.

**반환값:** [ImagePipelineOutput](/docs/diffusers/main/ko/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) 또는 `tuple`

`return_dict`가 `True`인 경우 [ImagePipelineOutput](/docs/diffusers/main/ko/api/pipelines/consistency_models#diffusers.ImagePipelineOutput)가 반환되고, 그렇지 않으면 첫 번째 요소가 생성된 이미지의 목록인 `tuple`이 반환됩니다.

생성을 위한 pipeline의 호출 함수.

예:

```py
>>> from diffusers import DDIMPipeline
>>> import PIL.Image
>>> import numpy as np

>>> # load model and scheduler
>>> pipe = DDIMPipeline.from_pretrained("fusing/ddim-lsun-bedroom")

>>> # run pipeline in inference (sample random noise and denoise)
>>> image = pipe(eta=0.0, num_inference_steps=50)

>>> # process image to PIL
>>> image_processed = image.cpu().permute(0, 2, 3, 1)
>>> image_processed = (image_processed + 1.0) * 127.5
>>> image_processed = image_processed.numpy().astype(np.uint8)
>>> image_pil = PIL.Image.fromarray(image_processed[0])

>>> # save image
>>> image_pil.save("test.png")
```

## ImagePipelineOutput[[diffusers.ImagePipelineOutput]]

#### diffusers.ImagePipelineOutput[[diffusers.ImagePipelineOutput]]

```python
diffusers.ImagePipelineOutput(images: list[PIL.Image.Image] | numpy.ndarray)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/pipeline_utils.py#L135)

**매개변수:**

images (`List[PIL.Image.Image]` 또는 `np.ndarray`) : `batch_size` 길이의 노이즈 제거된 PIL 이미지 목록 또는 `(batch_size, height, width, num_channels)` 모양의 NumPy 배열.

이미지 파이프라인의 출력 클래스입니다.

