InstaSoyjak / app.py
AP123's picture
Update app.py
1364b7b verified
import gradio as gr
import torch
from PIL import Image
from diffusers import AutoPipelineForText2Image, DDIMScheduler
from transformers import CLIPVisionModelWithProjection
import numpy as np
import spaces
# Initialize the image encoder and pipeline outside the function
image_encoder = CLIPVisionModelWithProjection.from_pretrained(
"h94/IP-Adapter",
subfolder="models/image_encoder",
torch_dtype=torch.float16,
)
pipeline = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16,
image_encoder=image_encoder,
)
pipeline.scheduler = DDIMScheduler.from_config(pipeline.scheduler.config)
pipeline.load_ip_adapter("h94/IP-Adapter", subfolder="sdxl_models", weight_name=["ip-adapter-plus_sdxl_vit-h.safetensors", "ip-adapter-plus-face_sdxl_vit-h.safetensors"])
pipeline.enable_model_cpu_offload()
@spaces.GPU
def transform_image(face_image, soy_strength, face_strength):
generator = torch.Generator(device="cpu").manual_seed(0)
if isinstance(face_image, Image.Image):
processed_face_image = face_image
elif isinstance(face_image, np.ndarray):
processed_face_image = Image.fromarray(face_image)
else:
raise ValueError("Unsupported image format")
style_image_path = "examples/soyjak2.jpg"
style_image = Image.open(style_image_path)
# Set the IP adapter scale dynamically based on the sliders
pipeline.set_ip_adapter_scale([soy_strength, face_strength])
image = pipeline(
prompt="soyjak",
ip_adapter_image=[style_image, processed_face_image],
negative_prompt="monochrome, lowres, bad anatomy, worst quality, low quality",
num_inference_steps=50,
generator=generator,
).images[0]
return image
# Gradio interface setup with dynamic sliders
demo = gr.Interface(
fn=transform_image,
inputs=[
gr.Image(label="Upload your face image"),
gr.Slider(minimum=0, maximum=1, step=0.05, value=0.7, label="Soy Strength"),
gr.Slider(minimum=0, maximum=1, step=0.05, value=1.0, label="Face Strength") # Renamed to Face Strength
],
outputs=gr.Image(label="Your Soyjak"),
title="InstaSoyjak - turn anyone into a Soyjak",
description="All you need to do is upload an image and adjust the strengths. **Please use responsibly.**",
)
demo.queue(max_size=20)
demo.launch()