import sys import os sys.path.append( os.path.join( os.path.dirname(__file__), "..", "..", ) ) from utils.wrapper import StreamDiffusionWrapper import torch # from config import Args from pydantic import BaseModel, Field from PIL import Image import math # base_model = "stabilityai/sd-turbo" # taesd_model = "madebyollin/taesd" base_model = "./models/sd-turbo" taesd_model = "./models/taesd" default_prompt = "Portrait of The Joker halloween costume, face painting, with , glare pose, detailed, intricate, full of colour, cinematic lighting, trending on artstation, 8k, hyperrealistic, focused, extreme details, unreal engine 5 cinematic, masterpiece" default_negative_prompt = "black and white, blurry, low resolution, pixelated, pixel art, low quality, low fidelity" page_content = """

StreamDiffusion

Image-to-Image SD-Turbo

This demo showcases StreamDiffusion Image to Image pipeline using SD-Turbo with a MJPEG stream server.

""" class Pipeline: class Info(BaseModel): name: str = "StreamDiffusion img2img" input_mode: str = "image" page_content: str = page_content class InputParams(BaseModel): prompt: str = Field( default_prompt, title="Prompt", field="textarea", id="prompt", ) # negative_prompt: str = Field( # default_negative_prompt, # title="Negative Prompt", # field="textarea", # id="negative_prompt", # ) width: int = Field( 512, min=2, max=15, title="Width", disabled=True, hide=True, id="width" ) height: int = Field( 512, min=2, max=15, title="Height", disabled=True, hide=True, id="height" ) def __init__(self, device: torch.device, torch_dtype: torch.dtype): params = self.InputParams() self.stream = StreamDiffusionWrapper( model_id_or_path=base_model, use_tiny_vae=True, device=device, dtype=torch_dtype, t_index_list=[1,16], # t_index_list=[1], frame_buffer_size=1, width=params.width, height=params.height, use_lcm_lora=False, output_type="pil", warmup=10, vae_id=taesd_model, acceleration="xformers", mode="img2img", use_denoising_batch=True, cfg_type="none", # use_safety_checker=args.safety_checker, enable_similar_image_filter=True, similar_image_filter_threshold=0.98, # engine_dir=args.engine_dir, ) self.last_prompt = default_prompt self.stream.prepare( prompt=default_prompt, negative_prompt=default_negative_prompt, num_inference_steps=30, guidance_scale=0.9, ) def predict(self, image: Image.Image, params: "Pipeline.InputParams") -> Image.Image: image_tensor = self.stream.preprocess_image(image) # output_image = self.stream(image=image_tensor, prompt=params.prompt) output_image = self.stream(image=image_tensor, prompt=params.prompt) return output_image