Spaces:
Runtime error
Runtime error
import os | |
import io | |
import base64 | |
import json | |
from typing import Callable, Any | |
from PIL import Image | |
import gradio as gr | |
from common import utils as posex | |
project_dir = os.path.dirname(os.path.abspath(__file__)) | |
print(project_dir) | |
if '__file__' in globals(): | |
posex.set_save_dir(os.path.join(os.path.dirname(__file__), '', 'saved_poses')) | |
else: | |
# cf. https://stackoverflow.com/a/53293924 | |
import inspect | |
posex.set_save_dir(os.path.join(os.path.dirname(inspect.getfile(lambda: None)), '', 'saved_poses')) | |
def js2py( | |
name: str, | |
id: Callable[[str], str], | |
js: Callable[[str], str], | |
sink: gr.components.IOComponent, | |
) -> gr.Textbox: | |
v_set = gr.Button(elem_id=id(f'{name}_set'),visible=False) | |
v = gr.Textbox(elem_id=id(name),visible=False) | |
v_sink = gr.Textbox(visible=False) | |
v_set.click(fn=None, _js=js(name), outputs=[v, v_sink]) | |
v_sink.change(fn=None, _js=js(f'{name}_after'), outputs=[sink]) | |
return v | |
def py2js( | |
name: str, | |
fn: Callable[[], str], | |
id: Callable[[str], str], | |
js: Callable[[str], str], | |
sink: gr.components.IOComponent, | |
) -> None: | |
v_fire = gr.Button(elem_id=id(f'{name}_get'),visible=False) | |
v_sink = gr.Textbox(visible=False) | |
v_sink2 = gr.Textbox(visible=False) | |
v_fire.click(fn=wrap_api(fn), outputs=[v_sink, v_sink2]) | |
v_sink2.change(fn=None, _js=js(name), inputs=[v_sink], outputs=[sink]) | |
def jscall( | |
name: str, | |
fn: Callable[[str], str], | |
id: Callable[[str], str], | |
js: Callable[[str], str], | |
sink: gr.components.IOComponent, | |
) -> None: | |
v_args_set = gr.Button(elem_id=id(f'{name}_args_set'), visible=False) | |
v_args = gr.JSON(elem_id=id(f'{name}_args'), visible=False) | |
v_args_sink = gr.JSON(visible=False) | |
v_args_set.click(fn=None, _js=js(f'{name}_args'), outputs=[v_args, v_args_sink]) | |
v_args_sink.change(fn=None, _js=js(f'{name}_args_after'), outputs=[sink]) | |
v_fire = gr.Button(elem_id=id(f'{name}_get'),visible=False) | |
v_sink = gr.Textbox(visible=False) | |
v_sink2 = gr.Textbox(visible=False) | |
v_fire.click(fn=wrap_api(fn), inputs=[v_args], outputs=[v_sink, v_sink2]) | |
v_sink2.change(fn=None, _js=js(name), inputs=[v_sink], outputs=[sink]) | |
def generatecall( | |
name: str, | |
fn: Callable[[str], str], | |
id: Callable[[str], str], | |
js: Callable[[str], str], | |
sink: gr.components.IOComponent, | |
prompt, | |
prompt_n, | |
output_img, | |
) -> None: | |
v_args_set = gr.Button(elem_id=id(f'{name}_args_set'), visible=False) | |
v_args = gr.JSON(elem_id=id(f'{name}_args'), visible=False) | |
v_args_sink = gr.JSON(visible=False) | |
v_args_set.click(fn=None, _js=js(f'{name}_args'), outputs=[v_args, v_args_sink]) | |
v_args_sink.change(fn=None, _js=js(f'{name}_args_after'), outputs=[sink]) | |
v_fire = gr.Button(elem_id=id(f'{name}_get'),visible=False) | |
v_sink = gr.Textbox(visible=False) | |
v_sink2 = gr.Textbox(visible=False) | |
v_fire.click(fn=fn, inputs=[v_args,prompt,prompt_n], outputs=[output_img]) | |
v_sink2.change(fn=None, _js=js(name), inputs=[v_sink], outputs=[sink]) | |
def get_self_extension(): | |
if '__file__' in globals(): | |
filepath = __file__ | |
else: | |
import inspect | |
filepath = inspect.getfile(lambda: None) | |
# APIs | |
def wrap_api(fn): | |
_r = 0 | |
def f(*args, **kwargs): | |
nonlocal _r | |
_r += 1 | |
v = fn(*args, **kwargs) | |
return v, str(_r) | |
return f | |
def all_pose(): | |
return json.dumps(list(posex.all_poses())) | |
def delete_pose(args): | |
posex.delete_pose(json.loads(args)[0]) | |
return '' | |
def save_pose(args): | |
posex.save_pose(json.loads(args)[0]) | |
return '' | |
def load_pose(args): | |
return json.dumps(posex.load_pose(json.loads(args)[0])) | |
# def get_imgs(args): | |
# return posex.get_img(args) | |
def generate_imgs(data, image_prompt, image_n_prompt): | |
return posex.generate_img(data, image_prompt, image_n_prompt) | |
def get_image_sketch(image_prompt, image_n_prompt, image): | |
return posex.get_image_sketch(image, image_prompt, image_n_prompt) | |
def javascript_html(): | |
script_js = f'script.js?{os.path.getmtime(os.path.join(project_dir,"script.js"))}' | |
path7 = f'javascript/posex-webui.js?{os.path.getmtime(os.path.join(project_dir,"javascript/posex-webui.js"))}' | |
head = f'<script type="text/javascript" src="file={script_js}"></script>\n' | |
head += f'<script type="text/javascript" src="file={path7}"></script>\n' | |
return head | |
def css_html(): | |
head = f'<link rel="stylesheet" property="stylesheet" href="file=style.css">' | |
return head | |
def reload_javascript(): | |
js = javascript_html() | |
css = css_html() | |
def template_response(*args, **kwargs): | |
res = GradioTemplateResponseOriginal(*args, **kwargs) | |
res.body = res.body.replace(b'</head>', f'{js}</head>'.encode("utf8")) | |
res.body = res.body.replace(b'</body>', f'{css}</body>'.encode("utf8")) | |
res.init_headers() | |
return res | |
gr.routes.templates.TemplateResponse = template_response | |
GradioTemplateResponseOriginal = gr.routes.templates.TemplateResponse | |
if __name__ == '__main__': | |
reload_javascript() | |
app = gr.Blocks() | |
with app: | |
is_img2img = [] | |
# id = lambda s: f'posex-{["t2i", "i2i"]}-{s}' | |
id = lambda s: f'posex-t2i-{s}' | |
js = lambda s: f'globalThis["{id(s)}"]' | |
ext = get_self_extension() | |
xpath = os.path.join(project_dir,"javascript/lazyload/posex-webui.js") | |
js_ = [project_dir, f'{xpath}?{os.path.getmtime(xpath)}'] | |
print(js_) | |
with gr.Blocks() as demo: | |
with gr.Tab("sketch"): | |
with gr.Row(): | |
image_prompt_sketch = gr.Textbox(label="image prompt", value='', elem_id=id('image_prompt')) | |
image_n_prompt_sketch = gr.Textbox(label="negative prompt", value='', | |
elem_id=id('image_n_prompt')) | |
with gr.Row(): | |
image_sketch = gr.Image(interactive=True,source='upload', type="numpy", tool="sketch").style(height=512, width=512) | |
result_img = gr.Gallery(label='Output', show_label=False, elem_id="gallery").style(grid=2, | |
height='auto') | |
with gr.Row(): | |
generate_result_button = gr.Button(value='generate') | |
generate_result_button.click(fn=get_image_sketch,inputs=[image_prompt_sketch, image_n_prompt_sketch, image_sketch], | |
outputs=[result_img]) | |
with gr.Tab("openpose", elem_id=id('tab')): | |
# with gr.Row(): | |
# enabled = gr.Checkbox(value=False, label='Send this image to ControlNet.', elem_id=id('enabled')) | |
# cn_num = gr.Number(value=0, precision=0, label='Target ControlNet number', visible=True) | |
with gr.Row(): | |
# segment_prompt = gr.Textbox(label="segment prompt", value='', | |
# elem_id=id('segment_prompt')) | |
image_prompt = gr.Textbox(label="image prompt", value='', elem_id=id('image_prompt')) | |
image_n_prompt = gr.Textbox(label="negative prompt", value='', | |
elem_id=id('image_n_prompt')) | |
gr.HTML(value='\n'.join(js_), elem_id=id('js'), visible=False) | |
gr.HTML(value='', elem_id=id('html')) | |
generate_button = gr.Button(elem_id=id(f'generate'), value='generate') | |
with gr.Column(): | |
result_img = gr.Gallery(label='Output', show_label=False, elem_id="gallery").style(grid=2, | |
height='auto') | |
with gr.Group(visible=False): | |
sink = gr.HTML(value='', visible=False) # to suppress error in javascript | |
base64 = js2py('base64', id, js, sink) | |
py2js('allposes', all_pose, id, js, sink) | |
jscall('delpose', delete_pose, id, js, sink) | |
jscall('savepose', save_pose, id, js, sink) | |
jscall('loadpose', load_pose, id, js, sink) | |
# jscall('getimgs', get_imgs, id, js, sink) | |
generatecall('getimgs', generate_imgs, id, js, sink, image_prompt, image_n_prompt, result_img) | |
app.launch() |