from __future__ import annotations from huggingface_hub import hf_hub_download import numpy as np import gradio as gr def create_demo_sr(process): with gr.Blocks() as demo: with gr.Row(): gr.Markdown('## Face Super Resolution') with gr.Row(): with gr.Column(): input_image = gr.Image(source='upload', type='filepath') model_type = gr.Radio(label='Model Type', choices=['SR for 32x','SR for 4x-48x'], value='SR for 32x') resize_scale = gr.Slider(label='Resize Scale', minimum=4, maximum=48, value=32, step=4) run_button = gr.Button(label='Run') gr.Examples( examples =[['pexels-daniel-xavier-1239291.jpg', 'SR for 32x', 32], ['ILip77SbmOE.png', 'SR for 32x', 32], ['ILip77SbmOE.png', 'SR for 4x-48x', 48], ], inputs = [input_image, model_type, resize_scale], ) with gr.Column(): #lrinput = gr.Image(label='Low-resolution input',type='numpy', interactive=False) #result = gr.Image(label='Output',type='numpy', interactive=False) result = gr.Gallery(label='LR input and Output', elem_id='gallery').style(grid=2, height='auto') inputs = [ input_image, resize_scale, model_type, ] run_button.click(fn=process, inputs=inputs, outputs=[result], api_name='sr') return demo def create_demo_s2f(process): with gr.Blocks() as demo: with gr.Row(): gr.Markdown('## Sketch-to-Face Translation') with gr.Row(): with gr.Column(): input_image = gr.Image(source='upload', type='filepath') gr.Markdown("""Note: Input will be cropped if larger than 512x512.""") seed = gr.Slider(label='Seed for appearance', minimum=0, maximum=2147483647, step=1, randomize=True) #input_info = gr.Textbox(label='Process Information', interactive=False, value='n.a.') run_button = gr.Button(label='Run') gr.Examples( examples =[['234_sketch.jpg', 1024]], inputs = [input_image, seed], ) with gr.Column(): result = gr.Image(label='Output',type='numpy', interactive=False) inputs = [ input_image, seed ] run_button.click(fn=process, inputs=inputs, outputs=[result], api_name='s2f') return demo def create_demo_m2f(process): with gr.Blocks() as demo: with gr.Row(): gr.Markdown('## Mask-to-Face Translation') with gr.Row(): with gr.Column(): input_image = gr.Image(source='upload', type='filepath') input_type = gr.Radio(label='Input Type', choices=['color image','parsing mask'], value='color image') seed = gr.Slider(label='Seed for appearance', minimum=0, maximum=2147483647, step=1, randomize=True) #input_info = gr.Textbox(label='Process Information', interactive=False, value='n.a.') run_button = gr.Button(label='Run') gr.Examples( examples =[['ILip77SbmOE.png', 'color image', 4], ['ILip77SbmOE_mask.png', 'parsing mask', 4]], inputs = [input_image, input_type, seed], ) with gr.Column(): #vizmask = gr.Image(label='Visualized mask',type='numpy', interactive=False) #result = gr.Image(label='Output',type='numpy', interactive=False) result = gr.Gallery(label='Visualized mask and Output', elem_id='gallery').style(grid=2, height='auto') inputs = [ input_image, input_type, seed ] run_button.click(fn=process, inputs=inputs, outputs=[result], api_name='m2f') return demo def create_demo_editing(process): with gr.Blocks() as demo: with gr.Row(): gr.Markdown('## Video Face Editing (for image input)') with gr.Row(): with gr.Column(): input_image = gr.Image(source='upload', type='filepath') model_type = gr.Radio(label='Editing Type', choices=['reduce age','light hair color'], value='color image') scale_factor = gr.Slider(label='editing degree (-2~2)', minimum=-2, maximum=2, value=1, step=0.1) #input_info = gr.Textbox(label='Process Information', interactive=False, value='n.a.') run_button = gr.Button(label='Run') gr.Examples( examples =[['ILip77SbmOE.png', 'reduce age', -2], ['ILip77SbmOE.png', 'light hair color', 1]], inputs = [input_image, model_type, scale_factor], ) with gr.Column(): result = gr.Image(label='Output',type='numpy', interactive=False) inputs = [ input_image, scale_factor, model_type ] run_button.click(fn=process, inputs=inputs, outputs=[result], api_name='editing') return demo def create_demo_toonify(process): with gr.Blocks() as demo: with gr.Row(): gr.Markdown('## Video Face Toonification (for image input)') with gr.Row(): with gr.Column(): input_image = gr.Image(source='upload', type='filepath') style_type = gr.Radio(label='Style Type', choices=['Pixar','Cartoon','Arcane'], value='Pixar') #input_info = gr.Textbox(label='Process Information', interactive=False, value='n.a.') run_button = gr.Button(label='Run') gr.Examples( examples =[['ILip77SbmOE.png', 'Pixar'], ['ILip77SbmOE.png', 'Cartoon'], ['ILip77SbmOE.png', 'Arcane']], inputs = [input_image, style_type], ) with gr.Column(): result = gr.Image(label='Output',type='numpy', interactive=False) inputs = [ input_image, style_type ] run_button.click(fn=process, inputs=inputs, outputs=[result], api_name='toonify') return demo def create_demo_vediting(process, max_frame_num = 4): with gr.Blocks() as demo: with gr.Row(): gr.Markdown('## Video Face Editing (for video input)') with gr.Row(): with gr.Column(): input_video = gr.Video(source='upload', mirror_webcam=False, type='filepath') model_type = gr.Radio(label='Editing Type', choices=['reduce age','light hair color'], value='color image') scale_factor = gr.Slider(label='editing degree (-2~2)', minimum=-2, maximum=2, value=1, step=0.1) info = '' if max_frame_num < 100: info = '(full video editing is not allowed so as not to slow down the demo, \ but you can duplicate the Space to modify the number limit to a large value)' frame_num = gr.Slider(label='Number of frames to edit' + info, minimum=1, maximum=max_frame_num, value=4, step=1) #input_info = gr.Textbox(label='Process Information', interactive=False, value='n.a.') run_button = gr.Button(label='Run') gr.Examples( examples =[['684.mp4', 'reduce age', 1.5, 2], ['684.mp4', 'light hair color', 0.7, 2]], inputs = [input_video, model_type, scale_factor], ) with gr.Column(): viz_result = gr.Gallery(label='Several edited frames', elem_id='gallery').style(grid=2, height='auto') result = gr.Video(label='Output', type='mp4', interactive=False) inputs = [ input_video, scale_factor, model_type, frame_num ] run_button.click(fn=process, inputs=inputs, outputs=[viz_result, result], api_name='vediting') return demo def create_demo_vtoonify(process, max_frame_num = 4): with gr.Blocks() as demo: with gr.Row(): gr.Markdown('## Video Face Toonification (for video input)') with gr.Row(): with gr.Column(): input_video = gr.Video(source='upload', mirror_webcam=False, type='filepath') style_type = gr.Radio(label='Style Type', choices=['Pixar','Cartoon','Arcane'], value='Pixar') info = '' if max_frame_num < 100: info = '(full video toonify is not allowed so as not to slow down the demo, \ but you can duplicate the Space to modify the number limit from 4 to a large value)' frame_num = gr.Slider(label='Number of frames to toonify' + info, minimum=1, maximum=max_frame_num, value=4, step=1) #input_info = gr.Textbox(label='Process Information', interactive=False, value='n.a.') run_button = gr.Button(label='Run') gr.Examples( examples =[['529_2.mp4', 'Arcane'], ['pexels-anthony-shkraba-production-8136210.mp4', 'Pixar'], ['684.mp4', 'Cartoon']], inputs = [input_video, style_type], ) with gr.Column(): viz_result = gr.Gallery(label='Several toonified frames', elem_id='gallery').style(grid=2, height='auto') result = gr.Video(label='Output', type='mp4', interactive=False) inputs = [ input_video, style_type, frame_num ] run_button.click(fn=process, inputs=inputs, outputs=[viz_result, result], api_name='vtoonify') return demo def create_demo_inversion(process, allow_optimization=False): with gr.Blocks() as demo: with gr.Row(): gr.Markdown('## StyleGANEX Inversion for Editing') with gr.Row(): with gr.Column(): input_image = gr.Image(source='upload', type='filepath') info = '' if allow_optimization == False: info = ' (latent optimization is not allowed so as not to slow down the demo, \ but you can duplicate the Space to modify the option or directly upload an optimized latent file. \ The file can be computed by inversion.py from the github page or colab)' optimize = gr.Radio(label='Whether optimize latent' + info, choices=['No optimization','Latent optimization'], value='No optimization', interactive=allow_optimization) input_latent = gr.File(label='Optimized latent code (optional)', file_types=[".pt"]) editing_options = gr.Dropdown(['None', 'Style Mixing', 'Attribute Editing: smile', 'Attribute Editing: open_eye', 'Attribute Editing: open_mouth', 'Attribute Editing: pose', 'Attribute Editing: reduce_age', 'Attribute Editing: glasses', 'Attribute Editing: light_hair_color', 'Attribute Editing: slender', 'Domain Transfer: disney_princess', 'Domain Transfer: vintage_comics', 'Domain Transfer: pixar', 'Domain Transfer: edvard_munch', 'Domain Transfer: modigliani', ], label="editing options (based on StyleGAN-NADA, InterFaceGAN, LowRankGAN)", value='None') scale_factor = gr.Slider(label='editing degree (-2~2) for Attribute Editing', minimum=-2, maximum=2, value=2, step=0.1) seed = gr.Slider(label='Appearance Seed for Style Mixing', minimum=0, maximum=2147483647, step=1, randomize=True) #input_info = gr.Textbox(label='Process Information', interactive=False, value='n.a.') run_button = gr.Button(label='Run') gr.Examples( examples =[['ILip77SbmOE.png', 'ILip77SbmOE_inversion.pt', 'Domain Transfer: vintage_comics'], ['ILip77SbmOE.png', 'ILip77SbmOE_inversion.pt', 'Attribute Editing: smile'], ['ILip77SbmOE.png', 'ILip77SbmOE_inversion.pt', 'Style Mixing'], ], inputs = [input_image, input_latent, editing_options], ) with gr.Column(): result = gr.Image(label='Inversion output',type='numpy', interactive=False) editing_result = gr.Image(label='Editing output',type='numpy', interactive=False) inputs = [ input_image, optimize, input_latent, editing_options, scale_factor, seed ] run_button.click(fn=process, inputs=inputs, outputs=[result, editing_result], api_name='inversion') return demo