DeepFloyd-IF (Imagen Free)
Project description
DeepFloyd-IF
We introduce DeepFloyd IF, a novel state-of-the-art open-source text-to-image model with a high degree of photorealism and language understanding. DeepFloyd IF is a modular composed of a frozen text encoder and three cascaded pixel diffusion modules: a base model that generates 64x64 px image based on text prompt and two super-resolution models, each designed to generate images of increasing resolution: 256x256 px and 1024x1024 px. All stages of the model utilize a frozen text encoder based on the T5 transformer to extract text embeddings, which are then fed into a UNet architecture enhanced with cross-attention and attention pooling. The result is a highly efficient model that outperforms current state-of-the-art models, achieving a zero-shot FID score of 6.66 on the COCO dataset. Our work underscores the potential of larger UNet architectures in the first stage of cascaded diffusion models and depicts a promising future for text-to-image synthesis.
Inspired by Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding
Minimum requirements to use all IF models:
- 16GB vRAM for IF-I 4.3B (text to 64x64 base model) & IF-II 1.2B (to 256x256 upscaler)
- 24GB vRAM for IF-I 4.3B (text to 64x64 base model), IF-II 1.2B (to 256x256 upscaler) & Stable x4 (to 1024x1024 upscaler)
- 40GB vRAM for the all 3 IF diffusion cascades (IF-I, IF-II, IF-III)
xformers
and set env variableFORCE_MEM_EFFICIENT_ATTN=1
Quick Start
pip install deepfloyd_if==1.0.0
pip install xformers==0.0.16
pip install git+https://github.com/openai/CLIP.git --no-deps
Local notebook and UI demo
The Dream, Style Transfer, Super Resolution or Inpainting modes are avaliable as in a Jupyter Notebook at IF/notebooks/pipes-DeepFloyd-IF.ipynb
or as Gradio UI demo that you can run locally with
pip install gradio
python IF/gradio/if_demo.py
Integration with 🤗 Diffusers
IF is also integrated with the 🤗 Hugging Face Diffusers library.
Diffusers runs each stage individually allowing the user to customize the image generation process as well as allowing to inspect intermediate results easily.
Example
Before you can use IF, you need to accept its usage conditions. To do so:
- Make sure to have a Hugging Face account and be loggin in
- Accept the license on the model card of DeepFloyd/IF-I-IF-v1.0 and DeepFloyd/IF-II-L-v1.0
- Make sure to login locally. Install
huggingface_hub
pip install huggingface_hub --upgrade
run the login function in a Python shell
from huggingface_hub import login
login()
and enter your Hugging Face Hub access token.
Next we install diffusers
and dependencies:
pip install diffusers accelerate transformers safetensors
And we can now run the model locally.
By default diffusers
makes use of model cpu offloading to run the whole IF pipeline with as little as 14 GB of VRAM.
If you are using torch>=2.0.0
, make sure to delete all enable_xformers_memory_efficient_attention()
functions.
from diffusers import DiffusionPipeline
from diffusers.utils import pt_to_pil
import torch
# stage 1
stage_1 = DiffusionPipeline.from_pretrained("DeepFloyd/IF-I-IF-v1.0", variant="fp16", torch_dtype=torch.float16)
stage_1.enable_xformers_memory_efficient_attention() # remove line if torch.__version__ >= 2.0.0
stage_1.enable_model_cpu_offload()
# stage 2
stage_2 = DiffusionPipeline.from_pretrained(
"DeepFloyd/IF-II-L-v1.0", text_encoder=None, variant="fp16", torch_dtype=torch.float16
)
stage_2.enable_xformers_memory_efficient_attention() # remove line if torch.__version__ >= 2.0.0
stage_2.enable_model_cpu_offload()
# stage 3
safety_modules = {"feature_extractor": stage_1.feature_extractor, "safety_checker": stage_1.safety_checker, "watermarker": stage_1.watermarker}
stage_3 = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-x4-upscaler", **safety_modules, torch_dtype=torch.float16)
stage_3.enable_xformers_memory_efficient_attention() # remove line if torch.__version__ >= 2.0.0
stage_3.enable_model_cpu_offload()
prompt = 'a photo of a kangaroo wearing an orange hoodie and blue sunglasses standing in front of the eiffel tower holding a sign that says "very deep learning"'
# text embeds
prompt_embeds, negative_embeds = stage_1.encode_prompt(prompt)
generator = torch.manual_seed(0)
# stage 1
image = stage_1(prompt_embeds=prompt_embeds, negative_prompt_embeds=negative_embeds, generator=generator, output_type="pt").images
pt_to_pil(image)[0].save("./if_stage_I.png")
# stage 2
image = stage_2(
image=image, prompt_embeds=prompt_embeds, negative_prompt_embeds=negative_embeds, generator=generator, output_type="pt"
).images
pt_to_pil(image)[0].save("./if_stage_II.png")
# stage 3
image = stage_3(prompt=prompt, image=image, generator=generator, noise_level=100).images
image[0].save("./if_stage_III.png")
There are multiple ways to speed up the inference time and lower the memory consumption even more with diffusers
. To do so, please have a look at the Diffusers docs:
For more in-detail information about how to use IF, please have a look at the IF blog post 📖.
Run the code locally
Loading the models into VRAM
from deepfloyd_if.modules import IFStageI, IFStageII, StableStageIII
from deepfloyd_if.modules.t5 import T5Embedder
device = 'cuda:0'
if_I = IFStageI('IF-I-IF-v1.0', device=device)
if_II = IFStageII('IF-II-L-v1.0', device=device)
if_III = StableStageIII('stable-diffusion-x4-upscaler', device=device)
t5 = T5Embedder(device="cpu")
I. Dream
Dream is the text-to-image mode of the IF model
from deepfloyd_if.pipelines import dream
prompt = 'ultra close-up color photo portrait of rainbow owl with deer horns in the woods'
count = 4
result = dream(
t5=t5, if_I=if_I, if_II=if_II, if_III=if_III,
prompt=[prompt]*count,
seed=42,
if_I_kwargs={
"guidance_scale": 7.0,
"sample_timestep_respacing": "smart100",
},
if_II_kwargs={
"guidance_scale": 4.0,
"sample_timestep_respacing": "smart50",
},
if_III_kwargs={
"guidance_scale": 9.0,
"noise_level": 20,
"sample_timestep_respacing": "75",
},
)
if_III.show(result['III'], size=14)
II. Zero-shot Image-to-Image Translation
In Style Transfer mode, the output of your prompt comes out at the style of the support_pil_img
from deepfloyd_if.pipelines import style_transfer
result = style_transfer(
t5=t5, if_I=if_I, if_II=if_II,
support_pil_img=raw_pil_image,
style_prompt=[
'in style of professional origami',
'in style of oil art, Tate modern',
'in style of plastic building bricks',
'in style of classic anime from 1990',
],
seed=42,
if_I_kwargs={
"guidance_scale": 10.0,
"sample_timestep_respacing": "10,10,10,10,10,10,10,10,0,0",
'support_noise_less_qsample_steps': 5,
},
if_II_kwargs={
"guidance_scale": 4.0,
"sample_timestep_respacing": 'smart50',
"support_noise_less_qsample_steps": 5,
},
)
if_I.show(result['II'], 1, 20)
III. Super Resolution
For super-resolution, users can run IF-II
and IF-III
on an image that was not necessarely generated by IF
96px --> 1024px
(two cascades):
from deepfloyd_if.pipelines import super_resolution
middle_res = super_resolution(
t5,
if_III=if_II,
prompt=['face of beautiful woman, makeup, detailed picture, 4k dslr, best quality'],
support_pil_img=raw_pil_image,
img_scale=4.0,
img_size=96,
if_III_kwargs={
'sample_timestep_respacing': 'smart100',
'aug_level': 0.25,
'guidance_scale': 4.0,
},
)
high_res = super_resolution(
t5,
if_III=if_III,
prompt=[''],
support_pil_img=middle_res['III'][0],
img_scale=1024/384,
img_size=384,
if_III_kwargs={
"guidance_scale": 9.0,
"noise_level": 20,
"sample_timestep_respacing": "75",
},
)
show_superres(raw_pil_image, high_res['III'][0])
384px --> 1024px
with aspect-ratio:
from deepfloyd_if.pipelines import super_resolution
_res = super_resolution(
t5,
if_III=if_III,
prompt=['cat, detailed picture, 4k dslr'],
support_pil_img=raw_pil_image,
img_scale=1024/384,
img_size=384,
if_III_kwargs={
"guidance_scale": 9.0,
"noise_level": 20,
"sample_timestep_respacing": "75",
},
)
show_superres(raw_pil_image, _res['III'][0])
IV. Zero-shot Inpainting
from deepfloyd_if.pipelines import inpainting
result = inpainting(
t5=t5, if_I=if_I,
if_II=if_II,
if_III=if_III,
support_pil_img=raw_pil_image,
inpainting_mask=inpainting_mask,
prompt=[
'oil art, a man in a hat',
],
seed=42,
if_I_kwargs={
"guidance_scale": 7.0,
"sample_timestep_respacing": "10,10,10,10,10,0,0,0,0,0",
'support_noise_less_qsample_steps': 0,
},
if_II_kwargs={
"guidance_scale": 4.0,
'aug_level': 0.0,
"sample_timestep_respacing": '100',
},
if_III_kwargs={
"guidance_scale": 9.0,
"noise_level": 20,
"sample_timestep_respacing": "75",
},
)
if_I.show(result['I'], 2, 3)
if_I.show(result['II'], 2, 6)
if_I.show(result['III'], 2, 14)
🤗 Model Zoo 🤗
The link to download the weights as well as the model cards are avaliable on each model of the model zoo
Original
Name | Cascade | Params | FID | Batch size | Steps |
---|---|---|---|---|---|
IF-I-M | I | 400M | 8.86 | 3072 | 2.5M |
IF-I-L | I | 900M | 8.06 | 3200 | 3.0M |
IF-I-IF* | I | 4.3B | 6.66 | 3072 | 2.42M |
IF-II-M | II | 450M | - | 1536 | 2.5M |
IF-II-L* | II | 1.2B | - | 1536 | 2.5M |
IF-III-L* (soon) | III | 700M | - | 3072 | 1.25M |
*best model
Quantitative Evaluation
FID = 6.66
License
The code in this repository is released under the MIT License with modification (see added point two).
The weights are available via the DeepFloyd organization at Hugging Face and have their own LICENSE.
Limitations and Biases
The models avaliable in this codebase have known limitations and biases. Please refer to the model card for more information.
Acknowledgements
Especially thanks to StabilityAI for support, provided GPU compute and infrastructure to train models Richard Vencu; thanks to LAION for provided and well-prepared datasets; thanks to Huggingface teams for optimisation speed and consumption of models in inference, creating demos and always cool advices!
🚀 External Contributors 🚀
- The Biggest Thanks @Apolinário, for ideas, consultations, help and support on all stages to make IF available in open-source; for writing a lot of documentation and instructions; for creating a friendly atmosphere in difficult moments 🦉;
- Thanks, @patrickvonplaten, for improving loading time of unet models by 80%; for integration Stable-Diffusion-x4 as native pipeline 💪;
- Thanks, @williamberman and @patrickvonplaten for diffusers integration 🙌;
- Thanks, @hysts and @Apolinário for creating the best gradio demo with IF 🚀;
- Thanks, @Dango233, for adaptation IF with xformers memory efficient attention 💪;
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for deepfloyd_if-1.0.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 77b7eabc82da544aa3f661872830c8eba2b53ff8d5d9455e45f85c5c75fd5cd7 |
|
MD5 | 37481fdebb8387970310a40e3e26b551 |
|
BLAKE2b-256 | 3ff09ea41bd1cf08ac6fe68c7e1edc07f969e50b8e240e1d46096e51733a6759 |