import os, argparse import json import sys import gradio as gr from scripts.gradio.i2v_test_application import Image2Video import spaces sys.path.insert(1, os.path.join(sys.path[0], 'lvdm')) i2v_examples_interp_512 = [ ['prompts/512_interp/74906_1462_frame1.png', 'walking man', 50, 7.5, 1.0, 10, 123, 'prompts/512_interp/74906_1462_frame3.png'], ['prompts/512_interp/Japan_v2_2_062266_s2_frame1.png', '', 50, 7.5, 1.0, 10, 789, 'prompts/512_interp/Japan_v2_2_062266_s2_frame3.png'], ['prompts/512_interp/Japan_v2_3_119235_s2_frame1.png', 'an anime scene', 50, 7.5, 1.0, 10, 123, 'prompts/512_interp/Japan_v2_3_119235_s2_frame3.png'], ] article = r""" このアプリはDoubiiu space からクローンしてきたものです。 研究実験にのみご利用ください。
「ToonCrafter」は、カートゥーン動画の補間における新しい生成手法です。従来の線形補間手法が持つ限界を克服するために、実写動画の動きの事前知識をカートゥーンに適用し、生成的補間を実現しています。主要な技術としては、実写動画の動きの事前知識をカートゥーンに適応させる「トゥーン修正学習戦略」、失われた細部を補う「デュアルリファレンス3Dデコーダー」、ユーザーが補間結果をインタラクティブに制御できる「スケッチエンコーダー」があります。実験により、ToonCrafterは既存の手法を上回る高品質な補間結果を示しています。 """ logo = r"""
ToonCrafter ロゴ
""" title = r"""

ToonCrafter: Generative Cartoon Interpolation

""" def dynamicrafter_demo(result_dir='./tmp/', res=512): if res == 1024: resolution = '576_1024' css = """#input_img {max-width: 1024px !important} #output_vid {max-width: 1024px; max-height:576px}""" elif res == 512: resolution = '320_512' css = """#input_img {max-width: 512px !important} #output_vid {max-width: 512px; max-height: 320px} #input_img2 {max-width: 512px !important} #output_vid {max-width: 512px; max-height: 320px}""" elif res == 256: resolution = '256_256' css = """#input_img {max-width: 256px !important} #output_vid {max-width: 256px; max-height: 256px}""" else: raise NotImplementedError(f"Unsupported resolution: {res}") image2video = Image2Video(result_dir, resolution=resolution) image2video.get_image = spaces.GPU(image2video.get_image, duration=120) with gr.Blocks(analytics_enabled=False, css=css) as dynamicrafter_iface: gr.Markdown(logo) gr.Markdown(title) gr.Markdown(article) with gr.Tab(label='ToonCrafter_320x512'): with gr.Column(): with gr.Row(): with gr.Column(): with gr.Row(): i2v_input_image = gr.Image(label="Input Image1",elem_id="input_img") with gr.Row(): i2v_input_text = gr.Text(label='Prompts') with gr.Row(): i2v_seed = gr.Slider(label='Random Seed', minimum=0, maximum=50000, step=1, value=123) i2v_eta = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='ETA', value=1.0, elem_id="i2v_eta") i2v_cfg_scale = gr.Slider(minimum=1.0, maximum=15.0, step=0.5, label='CFG Scale', value=7.5, elem_id="i2v_cfg_scale") with gr.Row(): i2v_steps = gr.Slider(minimum=1, maximum=60, step=1, elem_id="i2v_steps", label="Sampling steps", value=50) i2v_motion = gr.Slider(minimum=5, maximum=30, step=1, elem_id="i2v_motion", label="FPS", value=10) i2v_end_btn = gr.Button("Generate") with gr.Column(): with gr.Row(): i2v_input_image2 = gr.Image(label="Input Image2",elem_id="input_img2") with gr.Row(): i2v_output_video = gr.Video(label="Generated Video",elem_id="output_vid",autoplay=True,show_share_button=True) gr.Examples(examples=i2v_examples_interp_512, inputs=[i2v_input_image, i2v_input_text, i2v_steps, i2v_cfg_scale, i2v_eta, i2v_motion, i2v_seed, i2v_input_image2], outputs=[i2v_output_video], fn = image2video.get_image, cache_examples="lazy", ) i2v_end_btn.click(inputs=[i2v_input_image, i2v_input_text, i2v_steps, i2v_cfg_scale, i2v_eta, i2v_motion, i2v_seed, i2v_input_image2], outputs=[i2v_output_video], fn = image2video.get_image ) return dynamicrafter_iface def get_parser(): parser = argparse.ArgumentParser() return parser def check_auth(username, password): if len(username) == 0: return False user = os.getenv(username) if user is None: return False return user == password if __name__ == "__main__": parser = get_parser() args = parser.parse_args() result_dir = os.path.join('./', 'results') dynamicrafter_iface = dynamicrafter_demo(result_dir) # dynamicrafter_iface.queue(max_size=12) dynamicrafter_iface.launch() # dynamicrafter_iface.launch(server_name='0.0.0.0', server_port=80, max_threads=1)