Spaces:
Paused
Paused
File size: 4,174 Bytes
f011eee 708a6ea f011eee d4160b5 f011eee 708a6ea f011eee b72204b 91e6960 f011eee 708a6ea f011eee 708a6ea f011eee d4160b5 708a6ea f011eee 708a6ea f011eee 708a6ea f011eee 708a6ea f011eee b72204b 708a6ea f011eee 708a6ea f011eee 708a6ea b72204b 708a6ea f011eee |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
import spaces
import gradio as gr
import time
import torch
import gc
import tempfile
from diffusers.utils import export_to_video, load_image
from video_model import i2v_pipe
device = "cuda" if torch.cuda.is_available() else "cpu"
def create_demo() -> gr.Blocks:
@spaces.GPU(duration=60)
def image_to_video(
image_path: str,
prompt: str,
negative_prompt: str,
seed: int = 8,
width: int = 512,
height: int = 320,
num_frames: int = 100,
frame_rate: int = 20,
num_inference_steps: int = 30,
progress=gr.Progress(),
):
generator = torch.Generator(device=device).manual_seed(seed)
input_image = load_image(image_path)
run_task_time = 0
time_cost_str = ''
run_task_time, time_cost_str = get_time_cost(run_task_time, time_cost_str)
try:
with torch.no_grad():
video = i2v_pipe(
image=input_image,
prompt=prompt,
negative_prompt=negative_prompt,
generator=generator,
width=width,
height=height,
num_frames=num_frames,
num_inference_steps=num_inference_steps,
).frames[0]
finally:
torch.cuda.empty_cache()
gc.collect()
run_task_time, time_cost_str = get_time_cost(run_task_time, time_cost_str)
output_path = tempfile.mktemp(suffix=".mp4")
export_to_video(video, output_path, fps=frame_rate)
del video
torch.cuda.empty_cache()
return output_path, time_cost_str
def get_time_cost(run_task_time, time_cost_str):
now_time = int(time.time()*1000)
if run_task_time == 0:
time_cost_str = 'start'
else:
if time_cost_str != '':
time_cost_str += f'-->'
time_cost_str += f'{now_time - run_task_time}'
run_task_time = now_time
return run_task_time, time_cost_str
with gr.Blocks() as demo:
with gr.Row():
with gr.Column():
i2vid_image_path = gr.File(label="Input Image")
i2vid_prompt = gr.Textbox(
label="Enter Your Prompt",
placeholder="Describe the video you want to generate (minimum 50 characters)...",
value="A woman with long brown hair and light skin smiles at another woman with long blonde hair. The woman with brown hair wears a black jacket and has a small, barely noticeable mole on her right cheek. The camera angle is a close-up, focused on the woman with brown hair's face. The lighting is warm and natural, likely from the setting sun, casting a soft glow on the scene. The scene appears to be real-life footage.",
lines=5,
)
i2vid_negative_prompt = gr.Textbox(
label="Enter Negative Prompt",
placeholder="Describe what you don't want in the video...",
value="low quality, worst quality, deformed, distorted, disfigured, motion smear, motion artifacts, fused fingers, bad anatomy, weird hand, ugly",
lines=2,
)
i2vid_seed = gr.Slider(
label="Seed",
minimum=0,
maximum=2**32,
step=1,
value=8,
)
i2vid_generate = gr.Button(
"Generate Video",
variant="primary",
size="lg",
)
with gr.Column():
i2vid_output = gr.Video(label="Generated Output")
i2vid_generated_cost = gr.Textbox(label="Time cost by step (ms):", visible=True, interactive=False)
i2vid_generate.click(
fn=image_to_video,
inputs=[i2vid_image_path, i2vid_prompt, i2vid_negative_prompt, i2vid_seed],
outputs=[i2vid_output, i2vid_generated_cost],
)
return demo
|