|
|
|
|
|
import os |
|
import pathlib |
|
import tempfile |
|
|
|
import gradio as gr |
|
import torch |
|
from huggingface_hub import snapshot_download |
|
from modelscope.outputs import OutputKeys |
|
from modelscope.pipelines import pipeline |
|
|
|
DESCRIPTION = "# ModelScope-Image2Video" |
|
if not torch.cuda.is_available(): |
|
DESCRIPTION += "\n<p>Running on CPU 🥶 This demo does not work on CPU.</p>" |
|
|
|
if torch.cuda.is_available(): |
|
model_cache_dir = os.getenv("MODEL_CACHE_DIR", "./models") |
|
model_dir = pathlib.Path(model_cache_dir) / "MS-Image2Video" |
|
snapshot_download(repo_id="damo-vilab/MS-Image2Video", repo_type="model", local_dir=model_dir) |
|
pipe = pipeline(task="image-to-video", model=model_dir.as_posix(), model_revision="v1.1.0", device="cuda:0") |
|
else: |
|
pipe = None |
|
|
|
|
|
def image_to_video(image_path: str) -> str: |
|
output_file = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) |
|
pipe(image_path, output_video=output_file.name)[OutputKeys.OUTPUT_VIDEO] |
|
return output_file.name |
|
|
|
|
|
with gr.Blocks(css="style.css") as demo: |
|
gr.Markdown(DESCRIPTION) |
|
gr.DuplicateButton( |
|
value="Duplicate Space for private use", |
|
elem_id="duplicate-button", |
|
visible=os.getenv("SHOW_DUPLICATE_BUTTON") == "1", |
|
) |
|
with gr.Group(): |
|
input_image = gr.Image(label="Input image", type="filepath") |
|
run_button = gr.Button() |
|
output_video = gr.Video(label="Output video") |
|
|
|
run_button.click( |
|
fn=image_to_video, |
|
inputs=input_image, |
|
outputs=output_video, |
|
api_name="run", |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.queue(max_size=10).launch() |
|
|