diffusion_model / app.py
leowajda's picture
compile sampling step with autograph
ea54e12
raw
history blame
4.26 kB
import gradio as gr
import tensorflow as tf
import numpy as np
from huggingface_hub import from_pretrained_keras
from diffusion_sampler import DiffusionSampler
print(f"detected GPUs={tf.config.list_physical_devices('GPU')}")
scheduler_button = gr.Radio(
choices=["Linear", "Cosine"],
label="Noise Scheduler",
value="Linear",
info="""
Decides whether to employ a model trained with a linear scheduler,
as proposed by Jonathan Ho et al. in 'Denoising Diffusion Probabilistic Models',
or the cosine variant introduced by Alex Nichol et al. in 'Improved Denoising Diffusion Probabilistic Models'.
""",
)
sampling_button = gr.Radio(
choices=["DDPM", "DDIM"],
label="Sampling Procedure",
value="DDPM",
info="""
Selects either the stocasthic sampling procedure described by Jonathan Ho et al. in 'Denoising Diffusion Probabilistic Models',
or the implicit variant proposed by Jiaming Song et al. in 'Denoising Diffusion Implicit Models'.
For the latter, it is also necessary to specify the sub-sequence strategy and the number of sampling steps.
""",
)
subsequence_button = gr.Radio(
choices=["Linear", "Quadratic"],
label="Sub-Sequence",
value="Linear",
info="""
Specific to DDIM sampling, this parameter chooses the procedure
for forming the sub-sequence employed during the sampling process.
""",
)
ema_button = gr.Checkbox(
value=True,
label="Exponential Moving Average",
info="""
Whether to invoke the network with the applied exponential moving average on the model parameters.
Recommended for better results.
"""
)
images_button = gr.Number(
label="Number of images to generate",
value=5,
precision=0,
minimum=1,
maximum=64,
info="""
The number of images to be generated.
Larger batch sizes result in longer inference times.
"""
)
step_button = gr.Slider(
minimum=500,
value=1_000,
maximum=1_000,
randomize=True,
label="Number of sampling steps",
info="""
Relevant exclusively to DDIM sampling, this parameter determines the number of steps to be utilized during sampling.
The default value is set to 1000 in the case of DDPM sampling.
"""
)
gallery = gr.Gallery(
columns=4,
label="""
Generated Flowers
"""
)
linear_diffusion_model = DiffusionSampler(
model=from_pretrained_keras("leowajda/linear_diffusion"),
ema_model=from_pretrained_keras("leowajda/linear_diffusion_ema"),
noise_scheduler="linear",
)
cosine_diffusion_model = DiffusionSampler(
model=from_pretrained_keras("leowajda/cosine_diffusion"),
ema_model=from_pretrained_keras("leowajda/cosine_diffusion_ema"),
noise_scheduler="cosine",
)
def call_model(
model_to_call: str,
sample_strategy: str = "ddim",
step_strategy: str = "uniform",
ema: bool = True,
steps: int = 1_000,
num_images: int = 0,
progress=gr.Progress(track_tqdm=True),
):
diffusion_model = linear_diffusion_model if model_to_call.lower() == "linear" else cosine_diffusion_model
images = diffusion_model.generate_images(
num_images=num_images,
steps=steps,
sample_strategy=sample_strategy.lower(),
step_strategy=step_strategy.lower(),
ema=ema,
)
return images.numpy().astype(np.uint8)
demo = gr.Interface(
fn=call_model,
inputs=[scheduler_button, sampling_button, subsequence_button, ema_button, step_button, images_button],
outputs=gallery,
cache_examples=False,
title="""Unconditional Image Generation Through Denoising Diffusion Implicit Models""",
examples=[
["Linear", "DDPM", "Linear", True, 1_000, 10],
["Cosine", "DDIM", "Linear", True, 750, 20],
["Linear", "DDIM", "Quadratic", True, 750, 20]
],
description="""
<p align="center">
Supervisor: <strong>Wojciech Oronowicz – Jaśkowiak, PhD</strong>
&emsp;
Author: <strong>Leonardo Wajda</strong>
&emsp;
Specialization: <strong>Intelligent Data Processing Systems</strong>
</p>
""",
)
demo.queue().launch()