Rendernet/SuperfastStableDiffusion
1
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 