Team Ai
Apppublic

Rendernet/SuperfastStableDiffusion

sourceHugging Faceapache-2.0updated 3y agoView on Hugging Face
1likes
app.py284 linesDownload Raw Back to root
1import numpy as np2import gradio as gr3import requests4import time5import json6import base647import os8from io import BytesIO9import PIL10from PIL.ExifTags import TAGS11import html12import re13 14 15class RenderNet:16    def __init__(self, api_key, base=None):17        self.base = base or "https://app.rendernet.ai/api/"18        self.headers = {19            "rendernetapikey": api_key20        }21    22    def generate(self, params):23        response = self._post(f"{self.base}/generate", params)24        return response.json()25    26    def get_job(self, job_id):27        response = self._get(f"{self.base}/job/{job_id}")28        return response.json()29 30    def wait(self, job):31        job_result = job32 33        while job_result['status'] not in ['succeeded', 'failed']:34            time.sleep(1)35            job_result = self.get_job(job['job'])36            print("Job Result:")37            print(job_result)38        return job_result39 40    def list_models(self):41        response =[42                    'dreamshaper',        43                    'ghost_mix',44                    'proto_vision',       45                    'meina_unreal',46                    'realistic_vision',   47                    'animerge',48                    'oil_painting',       49                    'absolute_reality',50                    'meinamix',           51                    'rpg',52                    'western_animation',  53                    'dynavision',54                    'Realvis_XL',         55                    'abyss_orange_mix',56                    'anything_v5',       57                    'dreamshaper_xl',58                    'epic_realism',       59                    'comicbook_style',60                    'newdawnxl',          61                    'nextphoto',62                    'nightvisionxl',      63                    'juggernaut',64                    'cyber_realistic',    65                    'real_cartoon',66                    'unstable_diffusers', 67                    'cant_believe',68                    'majicmix_fantasy',   69                    'analog_madness',70                    'blazing_drive',     71                    'mysteriousxl',72                    'night_sky',         73                    'never_ending',74                    'dark_sushi',        75                    'meina_pastel',76                    'meina_alter',        77                    'counterfeitxl_v10',78                    'plagion_v10',        79                    'replicant_v3.0'80                    ]81 82        return response83 84    def list_samplers(self):85        response = [86                    'DPM++ SDE Karras',87                    'DPM++ 2M Karras'88                    'DPM++ 2S a Karras',89                    'Euler a',90                    'DPM++ 2M SDE Karras'91                    ]92        return response93 94    def _post(self, url, params):95        headers = {96            **self.headers,97            "Content-Type": "application/json"98        }99        response = requests.post(url, headers=headers, data=json.dumps(params))100 101        if response.status_code != 200:102            raise Exception(f"Bad RenderNet Response: {response.status_code}")103 104        return response105 106    def _get(self, url):107        response = requests.get(url, headers=self.headers)108 109        if response.status_code != 200:110            raise Exception(f"Bad RenderNet Response: {response.status_code}")111 112        return response113 114 115def remove_id_and_ext(text):116    text = re.sub(r'\[.*\]$', '', text)117    extension = text[-12:].strip()118    if extension == "safetensors":119        text = text[:-13]120    elif extension == "ckpt":121        text = text[:-4]122    return text123 124def get_data(text):125    results = {}126    patterns = {127        'prompt': r'(.*)',128        'negative_prompt': r'Negative prompt: (.*)',129        'steps': r'Steps: (\d+),',130        'seed': r'Seed: (\d+),',131        'sampler': r'Sampler:\s*([^\s,]+(?:\s+[^\s,]+)*)', 132        'model': r'Model:\s*([^\s,]+)',133        'cfg_scale': r'CFG scale:\s*([\d\.]+)',134        'size': r'Size:\s*([0-9]+x[0-9]+)'135        }136    for key in ['prompt', 'negative_prompt', 'steps', 'seed', 'sampler', 'model', 'cfg_scale', 'size']:137        match = re.search(patterns[key], text)138        if match:139            results[key] = match.group(1)140        else:141            results[key] = None142    if results['size'] is not None:143        w, h = results['size'].split("x")144        results['w'] = w145        results['h'] = h146    else:147        results['w'] = None148        results['h'] = None149    return results150 151def send_to_txt2img(image):152    153    result = {tabs: gr.Tabs.update(selected="t2i")}154 155    try:156        text = image.info['parameters']157        data = get_data(text)158        result[prompt] = gr.update(value=data['prompt'])159        result[negative_prompt] = gr.update(value=data['negative_prompt']) if data['negative_prompt'] is not None else gr.update()160        result[steps] = gr.update(value=int(data['steps'])) if data['steps'] is not None else gr.update()161        result[seed] = gr.update(value=int(data['seed'])) if data['seed'] is not None else gr.update()162        result[cfg_scale] = gr.update(value=float(data['cfg_scale'])) if data['cfg_scale'] is not None else gr.update()163        result[width] = gr.update(value=int(data['w'])) if data['w'] is not None else gr.update()164        result[height] = gr.update(value=int(data['h'])) if data['h'] is not None else gr.update()165        result[sampler] = gr.update(value=data['sampler']) if data['sampler'] is not None else gr.update()166        if model in model_names:167            result[model] = gr.update(value=model_names[model])168        else:169            result[model] = gr.update()170        return result171 172    except Exception as e:173        print(e)174        result[prompt] = gr.update()175        result[negative_prompt] = gr.update()176        result[steps] = gr.update()177        result[seed] = gr.update()178        result[cfg_scale] = gr.update()179        result[width] = gr.update()180        result[height] = gr.update()181        result[sampler] = gr.update()182        result[model] = gr.update()183 184        return result185 186 187rendernet_client = RenderNet(api_key=os.getenv("API_KEY"))188model_list = rendernet_client.list_models()189model_names = {}190 191for model_name in model_list:192    name_without_ext = remove_id_and_ext(model_name)193    print(name_without_ext)194    model_names[name_without_ext] = model_name195    print(model_names)196 197def txt2img(prompt, negative_prompt, model, steps, sampler, cfg_scale, width, height, seed):198    result = rendernet_client.generate({199        "prompt": prompt,200        "negative_prompt": negative_prompt,201        "model": model,202        "steps": steps,203        "sampler": sampler,204        "cfg_scale": cfg_scale,205        "width": width,206        "height": height,207        "seed": seed208    })209    210    print("Result Value:")211    print("")212    print(result)213 214    print("Job Value:")215    print("")216    job = rendernet_client.wait(result)217 218    return job["imageUrl"]219    220# Static Image URL221static_image_url = "https://baseavaar2.s3.amazonaws.com/banner.png"222static_image_link_url="https://rendernet.ai"223 224css = """225#generate {226    height: 100%;227}228"""229 230with gr.Blocks(css=css) as demo:231 232    # Add a Row for the Static Image233    with gr.Row():234        with gr.Column():235            static_image_with_link = gr.HTML(f'<a href="{static_image_link_url}" target="_blank"><img src="{static_image_url}" /></a>')236            237    with gr.Row():238        with gr.Column(scale=6):239            model = gr.Dropdown(interactive=True, value="dreamshaper", show_label=True, label="Stable Diffusion Checkpoint", choices=rendernet_client.list_models())240  241        with gr.Column(scale=1):242            gr.Markdown(elem_id="powered-by-rendernet", value="AUTOMATIC1111 Stable Diffusion Web UI.<br>Powered by [RenderNet](https://rendernet.ai).<br>For advanced features and faster generation times check out our API and Website(https://rendernet.ai/).")243 244 245    with gr.Tabs() as tabs:246        with gr.Tab("txt2img", id='t2i'):247            with gr.Row():248                with gr.Column(scale=6, min_width=600):249                    prompt = gr.Textbox("a master jedi cat in star wars with a lightsaber, wearing a jedi cloak hood in the kitchen (cat:1.3)", placeholder="Prompt", show_label=False, lines=3)250                    negative_prompt = gr.Textbox(placeholder="Negative Prompt", show_label=False, lines=3, value="(worst quality, low quality, normal quality:2)")251                with gr.Column():252                    text_button = gr.Button("Generate", variant='primary', elem_id="generate")253                    254            with gr.Row():255                with gr.Column(scale=3):256                    with gr.Tab("Generation"):257                        with gr.Row():258                            with gr.Column(scale=1):259                                sampler = gr.Dropdown(show_label=True, value="DPM++ SDE Karras", label="Sampling Method", choices=rendernet_client.list_samplers())260                                261                            with gr.Column(scale=1):262                                steps = gr.Slider(label="Sampling Steps", minimum=1, maximum=30, value=25, step=1)263    264                        with gr.Row():265                            with gr.Column(scale=1):266                                width = gr.Slider(label="Width", maximum=1024, value=512, step=8)267                                height = gr.Slider(label="Height", maximum=1024, value=512, step=8)268                            269                            with gr.Column(scale=1):270                                batch_size = gr.Slider(label="Batch Size", maximum=1, value=1)271                                batch_count = gr.Slider(label="Batch Count", maximum=1, value=1)272    273                        cfg_scale = gr.Slider(label="CFG Scale", minimum=1, maximum=20, value=7, step=1)274                        seed = gr.Number(label="Seed", value=-1)275    276                    277                with gr.Column(scale=2):278                    image_output = gr.Image(value="https://app.rendernet.ai/userfiles/1699956614571.5938.png")279    280            text_button.click(txt2img, inputs=[prompt, negative_prompt, model, steps, sampler, cfg_scale, width, height, seed], outputs=image_output)            281 282 283demo.queue(max_size=80, api_open=False).launch(max_threads=256)284