Spaces:
Runtime error
Runtime error
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""" | |
このアプリは<a href="https://huggingface.co/spaces/Doubiiu/tooncrafter" target="_blank">Doubiiu space</a> | |
からクローンしてきたものです。 | |
研究実験にのみご利用ください。 | |
</br> | |
「ToonCrafter」は、カートゥーン動画の補間における新しい生成手法です。従来の線形補間手法が持つ限界を克服するために、実写動画の動きの事前知識をカートゥーンに適用し、生成的補間を実現しています。主要な技術としては、実写動画の動きの事前知識をカートゥーンに適応させる「トゥーン修正学習戦略」、失われた細部を補う「デュアルリファレンス3Dデコーダー」、ユーザーが補間結果をインタラクティブに制御できる「スケッチエンコーダー」があります。実験により、ToonCrafterは既存の手法を上回る高品質な補間結果を示しています。 | |
""" | |
logo = r""" | |
<center><img src='https://doubiiu.github.io/projects/ToonCrafter/static/logo2.png' alt='ToonCrafter ロゴ' style="width:280px; margin-bottom:2px"></center> | |
""" | |
title = r""" | |
<h1 align="center">ToonCrafter: Generative Cartoon Interpolation</h1> | |
""" | |
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) |