From 32c556731f3b8a7aa4c80f4d28dadd99a929459b Mon Sep 17 00:00:00 2001 From: Patrick von Platen Date: Wed, 15 Jun 2022 11:50:41 +0200 Subject: [PATCH] improve readme --- README.md | 48 +++++++++++++++++++++---- docs/source/imgs/diffusers_library.jpg | Bin 0 -> 14061 bytes 2 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 docs/source/imgs/diffusers_library.jpg diff --git a/README.md b/README.md index 210efac201..7377817bb7 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,57 @@ -# Diffusers +

+
+ +
+

+

+ + GitHub + + + GitHub release + + + Contributor Covenant + + DOI +

+ +🤗 Diffusers provides pretrained diffusion models across multiple modalities, such as vision and audio, and serves +as a modular toolbox for inference and training of diffusion models. + +More precisely, 🤗 Diffusers offers: + +- State-of-the-art diffusion pipelines that can be run in inference with just a couple of lines of code (see [src/diffusers/pipelines](https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines)). +- Various noise schedulers that can be used interchangeably for the prefered speed vs. quality trade-off in inference (see [src/diffusers/schedulers](https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers)). +- Multiple types of diffusion models, such as UNet, that can be used as building blocks in an end-to-end diffusion system (see [src/diffusers/models](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models)). +- Training examples to show how to train the most popular diffusion models (see [examples](https://github.com/huggingface/diffusers/tree/main/examples)) ## Definitions -**Models**: Single neural network that models p_θ(x_t-1|x_t) and is trained to “denoise” to image -*Examples: UNet, Conditioned UNet, 3D UNet, Transformer UNet* +**Models**: Neural network that models **p_θ(x_t-1|x_t)** (see image below) and is trained end-to-end to *denoise* a noisy input to an image. +*Examples*: UNet, Conditioned UNet, 3D UNet, Transformer UNet ![model_diff_1_50](https://user-images.githubusercontent.com/23423619/171610307-dab0cd8b-75da-4d4e-9f5a-5922072e2bb5.png) -**Schedulers**: Algorithm to compute previous image according to alpha, beta schedule and to sample noise. Should be used for both *training* and *inference*. -*Example: Gaussian DDPM, DDIM, PMLS, DEIN* +**Schedulers**: Algorithm class for both **inference** and **training**. +The class provides functionality to compute previous image according to alpha, beta schedule as well as predict noise for training. +*Examples*: [DDPM](https://arxiv.org/abs/2006.11239), [DDIM](https://arxiv.org/abs/2010.02502), [PNDM](https://arxiv.org/abs/2202.09778), [DEIS](https://arxiv.org/abs/2204.13902) ![sampling](https://user-images.githubusercontent.com/23423619/171608981-3ad05953-a684-4c82-89f8-62a459147a07.png) ![training](https://user-images.githubusercontent.com/23423619/171608964-b3260cce-e6b4-4841-959d-7d8ba4b8d1b2.png) -**Diffusion Pipeline**: End-to-end pipeline that includes multiple diffusion models, possible text encoders, CLIP -*Example: GLIDE,CompVis/Latent-Diffusion, Imagen, DALL-E* +**Diffusion Pipeline**: End-to-end pipeline that includes multiple diffusion models, possible text encoders, ... +*Examples*: GLIDE, Latent-Diffusion, Imagen, DALL-E 2 ![imagen](https://user-images.githubusercontent.com/23423619/171609001-c3f2c1c9-f597-4a16-9843-749bf3f9431c.png) + +## Philosophy + +- Readability and clarity is prefered over highly optimized code. A strong importance is put on providing readable, intuitive and elementary code desgin. *E.g.*, the provided [schedulers](https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers) are separated from the provided [models](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models) and provide well-commented code that can be read alongside the original paper. +- Diffusers is **modality independent** and focusses on providing pretrained models and tools to build systems that generate **continous outputs**, *e.g.* vision and audio. +- Diffusion models and schedulers are provided as consise, elementary building blocks whereas diffusion pipelines are a collection of end-to-end diffusion systems that can be used out-of-the-box, should stay as close as possible to their original implementation and can include components of other library, such as text-encoders. Examples for diffusion pipelines are [Glide](https://github.com/openai/glide-text2im) and [Latent Diffusion](https://github.com/CompVis/latent-diffusion). + ## Quickstart ``` diff --git a/docs/source/imgs/diffusers_library.jpg b/docs/source/imgs/diffusers_library.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07ba9c6571a3f070d9d10b78dccfd4d4537dd539 GIT binary patch literal 14061 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 UDR@TnUhH3q`Tr9d=HvAL0;5n25C8xG literal 0 HcmV?d00001