# DDPM

Jonathan Ho, Ajay Jain, Pieter Abbeel의 [Denoising Diffusion Probabilistic Models](https://huggingface.co/papers/2006.11239)(DDPM)은 동명의 diffusion 기반 모델을 제안합니다. 🤗 Diffusers 라이브러리에서 DDPM은 해당 논문에서 제시한 *discrete denoising scheduler*와 파이프라인을 모두 가리킵니다.

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

*비평형 열역학의 고려 사항에서 영감을 받은 잠재 변수 모델의 한 종류인 확률적 확산 모델(diffusion probabilistic models)을 사용하여 고품질 이미지 합성 결과를 제시합니다. 우리의 최우수 결과는 Langevin 동역학을 통한 노이즈 제거 점수 매칭(denoising score matching)과 확률적 확산 모델 간의 새로운 연결에 따라 설계된 가중치 변분 경계(weighted variational bound)로 학습함으로써 얻어졌으며, 우리의 모델은 자기 회귀 디코딩(autoregressive decoding)의 일반화로 해석될 수 있는 점진적 손실 압축 해제(progressive lossy decompression) 스킴을 자연스럽게 허용합니다. 무조건적 CIFAR10 데이터셋에서 Inception score 9.46과 최첨단 FID score 3.17을 달성했습니다. 256x256 LSUN에서는 ProgressiveGAN과 유사한 샘플 품질을 얻었습니다.*

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

> [!TIP]
> Scheduler의 [가이드](../../using-diffusers/schedulers)를 확인하여 스케줄러의 속도와 품질 사이의 트레이드오프를 탐색하는 방법을 배우고, [파이프라인 간 구성 요소 재사용](../../using-diffusers/loading#reusing-models-in-multiple-pipelines) 섹션을 확인하여 동일한 구성 요소를 여러 파이프라인에 효율적으로 로드하는 방법을 배워보세요.

# DDPMPipeline[[diffusers.DDPMPipeline]]

#### diffusers.DDPMPipeline[[diffusers.DDPMPipeline]]

```python
diffusers.DDPMPipeline(unet: UNet2DModel, scheduler: DDPMScheduler)
```

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

**매개변수:**

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.DDPMPipeline.__call__]]

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

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

**매개변수:**

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

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

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

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 DDPMPipeline

>>> # load model and scheduler
>>> pipe = DDPMPipeline.from_pretrained("google/ddpm-cat-256")

>>> # run pipeline in inference (sample random noise and denoise)
>>> image = pipe().images[0]

>>> # save image
>>> image.save("ddpm_generated_image.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 배열.

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

