CoolFace
Apppublic

faraidun/LivePortrait5

sourceHugging Faceupdated 2y agoView on Hugging Face
1likes
app.py223 linesDownload Raw Back to root
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