faraidun/LivePortrait5
1
1# coding: utf-82 3"""4The entrance of the gradio5"""6 7import tyro8import gradio as gr9import os.path as osp10from src.utils.helper import load_description11from src.gradio_pipeline import GradioPipeline12from src.config.crop_config import CropConfig13from src.config.argument_config import ArgumentConfig14from src.config.inference_config import InferenceConfig15import spaces16import cv217 18# import gdown19# folder_url = f"https://drive.google.com/drive/folders/1UtKgzKjFAOmZkhNK-OYT0caJ_w2XAnib"20# gdown.download_folder(url=folder_url, output="pretrained_weights", quiet=False)21 22def partial_fields(target_class, kwargs):23 return target_class(**{k: v for k, v in kwargs.items() if hasattr(target_class, k)})24 25# set tyro theme26tyro.extras.set_accent_color("bright_cyan")27args = tyro.cli(ArgumentConfig)28 29# specify configs for inference30inference_cfg = partial_fields(InferenceConfig, args.__dict__) # use attribute of args to initial InferenceConfig31crop_cfg = partial_fields(CropConfig, args.__dict__) # use attribute of args to initial CropConfig32 33gradio_pipeline = GradioPipeline(34 inference_cfg=inference_cfg,35 crop_cfg=crop_cfg,36 args=args37)38 39@spaces.GPU(duration=240)40def gpu_wrapped_execute_video(*args, **kwargs):41 return gradio_pipeline.execute_video(*args, **kwargs)42 43@spaces.GPU(duration=240)44def gpu_wrapped_execute_image(*args, **kwargs):45 return gradio_pipeline.execute_image(*args, **kwargs)46 47def is_square_video(video_path):48 video = cv2.VideoCapture(video_path)49 50 width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))51 height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))52 53 video.release()54 if width != height:55 raise gr.Error("Error: the video does not have a square aspect ratio. We currently only support square videos")56 57 return gr.update(visible=True)58 59# assets60title_md = "assets/gradio_title.md"61example_portrait_dir = "assets/examples/source"62example_video_dir = "assets/examples/driving"63data_examples = [64 [osp.join(example_portrait_dir, "s9.jpg"), osp.join(example_video_dir, "d0.mp4"), True, True, True, True],65 [osp.join(example_portrait_dir, "s6.jpg"), osp.join(example_video_dir, "d0.mp4"), True, True, True, True],66 [osp.join(example_portrait_dir, "s10.jpg"), osp.join(example_video_dir, "d0.mp4"), True, True, True, True],67 [osp.join(example_portrait_dir, "s5.jpg"), osp.join(example_video_dir, "d15.mp4"), True, True, True, True],68 [osp.join(example_portrait_dir, "s7.jpg"), osp.join(example_video_dir, "d16.mp4"), True, True, True, True],69]70#################### interface logic ####################71 72# Define components first73eye_retargeting_slider = gr.Slider(minimum=0, maximum=0.8, step=0.01, label="target eyes-open ratio")74lip_retargeting_slider = gr.Slider(minimum=0, maximum=0.8, step=0.01, label="target lip-open ratio")75retargeting_input_image = gr.Image(type="filepath")76output_image = gr.Image(type="numpy")77output_image_paste_back = gr.Image(type="numpy")78output_video = gr.Video()79output_video_concat = gr.Video()80 81with gr.Blocks(theme=gr.themes.Soft()) as demo:82 gr.HTML(load_description(title_md))83 gr.Markdown(load_description("assets/gradio_description_upload.md"))84 with gr.Row():85 with gr.Accordion(open=True, label="Source Portrait"):86 image_input = gr.Image(type="filepath")87 gr.Examples(88 examples=[89 [osp.join(example_portrait_dir, "s9.jpg")],90 [osp.join(example_portrait_dir, "s6.jpg")],91 [osp.join(example_portrait_dir, "s10.jpg")],92 [osp.join(example_portrait_dir, "s5.jpg")],93 [osp.join(example_portrait_dir, "s7.jpg")],94 [osp.join(example_portrait_dir, "s12.jpg")],95 ],96 inputs=[image_input],97 cache_examples=False,98 )99 with gr.Accordion(open=True, label="Driving Video"):100 video_input = gr.Video()101 gr.Examples(102 examples=[103 [osp.join(example_video_dir, "d0.mp4")],104 [osp.join(example_video_dir, "d15.mp4")],105 [osp.join(example_video_dir, "d16.mp4")],106 [osp.join(example_video_dir, "d14_trim.mp4")],107 [osp.join(example_video_dir, "d6_trim.mp4")],108 ],109 inputs=[video_input],110 cache_examples=False,111 )112 with gr.Row():113 with gr.Accordion(open=False, label="Animation Instructions and Options"):114 gr.Markdown(load_description("assets/gradio_description_animation.md"))115 with gr.Row():116 flag_relative_input = gr.Checkbox(value=True, label="relative motion")117 flag_do_crop_input = gr.Checkbox(value=True, label="do crop")118 flag_remap_input = gr.Checkbox(value=True, label="paste-back")119 with gr.Row():120 with gr.Column():121 process_button_animation = gr.Button("๐ Animate", variant="primary")122 with gr.Column():123 process_button_reset = gr.ClearButton([image_input, video_input, output_video, output_video_concat], value="๐งน Clear")124 with gr.Row():125 with gr.Column():126 with gr.Accordion(open=True, label="The animated video in the original image space"):127 output_video.render()128 with gr.Column():129 with gr.Accordion(open=True, label="The animated video"):130 output_video_concat.render()131 with gr.Row():132 # Examples133 gr.Markdown("## You could also choose the examples below by one click โฌ๏ธ")134 with gr.Row():135 gr.Examples(136 examples=data_examples,137 fn=gpu_wrapped_execute_video,138 inputs=[139 image_input,140 video_input,141 flag_relative_input,142 flag_do_crop_input,143 flag_remap_input144 ],145 outputs=[output_image, output_image_paste_back],146 examples_per_page=5,147 cache_examples=False,148 )149 gr.Markdown(load_description("assets/gradio_description_retargeting.md"), visible=True)150 with gr.Row(visible=True):151 eye_retargeting_slider.render()152 lip_retargeting_slider.render()153 with gr.Row(visible=True):154 process_button_retargeting = gr.Button("๐ Retargeting", variant="primary")155 process_button_reset_retargeting = gr.ClearButton(156 [157 eye_retargeting_slider,158 lip_retargeting_slider,159 retargeting_input_image,160 output_image,161 output_image_paste_back162 ],163 value="๐งน Clear"164 )165 with gr.Row(visible=True):166 with gr.Column():167 with gr.Accordion(open=True, label="Retargeting Input"):168 retargeting_input_image.render()169 gr.Examples(170 examples=[171 [osp.join(example_portrait_dir, "s9.jpg")],172 [osp.join(example_portrait_dir, "s6.jpg")],173 [osp.join(example_portrait_dir, "s10.jpg")],174 [osp.join(example_portrait_dir, "s5.jpg")],175 [osp.join(example_portrait_dir, "s7.jpg")],176 [osp.join(example_portrait_dir, "s12.jpg")],177 ],178 inputs=[retargeting_input_image],179 cache_examples=False,180 )181 with gr.Column():182 with gr.Accordion(open=True, label="Retargeting Result"):183 output_image.render()184 with gr.Column():185 with gr.Accordion(open=True, label="Paste-back Result"):186 output_image_paste_back.render()187 # binding functions for buttons188 process_button_retargeting.click(189 # fn=gradio_pipeline.execute_image,190 fn=gpu_wrapped_execute_image,191 inputs=[eye_retargeting_slider, lip_retargeting_slider, retargeting_input_image, flag_do_crop_input],192 outputs=[output_image, output_image_paste_back],193 show_progress=True194 )195 process_button_animation.click(196 fn=gpu_wrapped_execute_video,197 inputs=[198 image_input,199 video_input,200 flag_relative_input,201 flag_do_crop_input,202 flag_remap_input203 ],204 outputs=[output_video, output_video_concat],205 show_progress=True206 )207 # image_input.change(208 # fn=gradio_pipeline.prepare_retargeting,209 # inputs=image_input,210 # outputs=[eye_retargeting_slider, lip_retargeting_slider, retargeting_input_image]211 # )212 video_input.upload(213 fn=is_square_video,214 inputs=video_input,215 outputs=video_input216 )217 218demo.launch(219 server_port=args.server_port,220 share=args.share,221 server_name=args.server_name222)223 