zainjaved's picture
Update app.py
ed2c8a0 verified
import gradio as gr
import numpy as np
import random
from PIL import Image
import os
import spaces
from diffusers import DiffusionPipeline, FlowMatchEulerDiscreteScheduler, StableDiffusionImg2ImgPipeline
import torch
from huggingface_hub import login
# Get token from Hugging Face Spaces secrets
# This will use the environment variable HF_ACCESS_TOKEN which is the standard in HF Spaces
hf_token = os.environ.get("HF_ACCESS_TOKEN")
if hf_token:
login(hf_token)
else:
print("Warning: HF_ACCESS_TOKEN not found in environment. Authentication may fail.")
device = "cuda" if torch.cuda.is_available() else "cpu"
model_repo_id = "stabilityai/stable-diffusion-3.5-medium"
if torch.cuda.is_available():
torch_dtype = torch.float16
else:
torch_dtype = torch.float32
# For text-to-image
pipe = DiffusionPipeline.from_pretrained(
model_repo_id,
torch_dtype=torch_dtype,
use_auth_token=True # This will use the token from login()
)
pipe.scheduler = FlowMatchEulerDiscreteScheduler.from_pretrained(
model_repo_id,
subfolder="scheduler",
shift=5,
use_auth_token=True
)
pipe = pipe.to(device)
# For image-to-image
img2img_pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
model_repo_id,
torch_dtype=torch_dtype,
use_auth_token=True
)
img2img_pipe.scheduler = FlowMatchEulerDiscreteScheduler.from_pretrained(
model_repo_id,
subfolder="scheduler",
shift=5,
use_auth_token=True
)
img2img_pipe = img2img_pipe.to(device)
MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 1024
@spaces.GPU(duration=65)
def infer(
prompt,
negative_prompt="",
seed=42,
randomize_seed=False,
width=1024,
height=1024,
guidance_scale=1.5,
num_inference_steps=8,
input_image=None,
strength=0.8,
progress=gr.Progress(track_tqdm=True),
):
if randomize_seed:
seed = random.randint(0, MAX_SEED)
generator = torch.Generator().manual_seed(seed)
# Text-to-image if no input image is provided
if input_image is None:
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
width=width,
height=height,
generator=generator,
).images[0]
# Image-to-image if an input image is provided
else:
# Convert to PIL Image if it's a numpy array
if isinstance(input_image, np.ndarray):
input_image = Image.fromarray(input_image)
# Resize image to match requested dimensions
input_image = input_image.resize((width, height), Image.LANCZOS)
image = img2img_pipe(
prompt=prompt,
negative_prompt=negative_prompt,
image=input_image,
strength=strength,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
generator=generator,
).images[0]
return image, seed
examples = [
"A capybara wearing a suit holding a sign that reads Hello World",
]
css = """
#col-container {
margin: 0 auto;
max-width: 640px;
}
"""
with gr.Blocks(css=css) as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown(" # TensorArt Stable Diffusion 3.5 Large TurboX")
gr.Markdown(
"[8-step distilled turbo model](https://huggingface.co/tensorart/stable-diffusion-3.5-large-TurboX)")
with gr.Row():
prompt = gr.Text(
label="Prompt",
show_label=False,
max_lines=1,
placeholder="Enter your prompt",
container=False,
)
run_button = gr.Button("Run", scale=0, variant="primary")
# Add image upload component
input_image = gr.Image(
label="Input Image (Optional)",
type="pil",
sources=["upload", "clipboard"],
)
result = gr.Image(label="Result", show_label=False)
with gr.Accordion("Advanced Settings", open=False):
negative_prompt = gr.Text(
label="Negative prompt",
max_lines=1,
placeholder="Enter a negative prompt",
)
seed = gr.Slider(
label="Seed",
minimum=0,
maximum=MAX_SEED,
step=1,
value=0,
)
randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
with gr.Row():
width = gr.Slider(
label="Width",
minimum=512,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,
)
height = gr.Slider(
label="Height",
minimum=512,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,
)
with gr.Row():
guidance_scale = gr.Slider(
label="Guidance scale",
minimum=0.0,
maximum=7.5,
step=0.1,
value=1.5,
)
num_inference_steps = gr.Slider(
label="Number of inference steps",
minimum=1,
maximum=50,
step=1,
value=8,
)
# Add strength parameter for image-to-image
strength = gr.Slider(
label="Strength (for image-to-image)",
minimum=0.0,
maximum=1.0,
step=0.01,
value=0.8,
info="How much to transform the reference image. 1.0 means complete transformation."
)
gr.Examples(examples=examples, inputs=[prompt], outputs=[result, seed], fn=infer, cache_examples=True,
cache_mode="lazy")
gr.on(
triggers=[run_button.click, prompt.submit],
fn=infer,
inputs=[
prompt,
negative_prompt,
seed,
randomize_seed,
width,
height,
guidance_scale,
num_inference_steps,
input_image,
strength,
],
outputs=[result, seed],
)
if __name__ == "__main__":
demo.launch()