Spaces:
Running
Running
| import json | |
| import time | |
| import uvicorn | |
| from pathlib import Path | |
| from fastapi import FastAPI | |
| from fastapi.responses import RedirectResponse | |
| from fastapi.staticfiles import StaticFiles | |
| from dataset.tracks_motion import TracksMotion | |
| from GPS import GPS | |
| import gradio as gr | |
| def _synthesis(synthesis_setting, motion_data): | |
| model = GPS( | |
| init_mode=f"random_synthesis/{synthesis_setting['frames']}", | |
| noise_sigma=synthesis_setting["noise_sigma"], | |
| coarse_ratio=0.2, | |
| pyr_factor=synthesis_setting["pyr_factor"], | |
| num_stages_limit=-1, | |
| silent=True, | |
| device="cpu", | |
| ) | |
| synthesized_motion = model.run( | |
| motion_data, | |
| mode="match_and_blend", | |
| ext={ | |
| "criteria": { | |
| "type": "PatchCoherentLoss", | |
| "patch_size": synthesis_setting["patch_size"], | |
| "stride": synthesis_setting["stride"] | |
| if "stride" in synthesis_setting.keys() | |
| else 1, | |
| "loop": synthesis_setting["loop"], | |
| "coherent_alpha": synthesis_setting["alpha"] | |
| if synthesis_setting["completeness"] | |
| else None, | |
| }, | |
| "optimizer": "match_and_blend", | |
| "num_itrs": synthesis_setting["num_steps"], | |
| }, | |
| ) | |
| return synthesized_motion | |
| def synthesis(data): | |
| data = json.loads(data) | |
| # create track object | |
| data["setting"]["coarse_ratio"] = -1 | |
| motion_data = TracksMotion(data["tracks"], scale=data["scale"]) | |
| start = time.time() | |
| synthesized_motion = _synthesis(data["setting"], [motion_data]) | |
| end = time.time() | |
| data["time"] = end - start | |
| data["tracks"] = motion_data.parse(synthesized_motion) | |
| return data | |
| intro = """ | |
| <h1 style="text-align: center;"> | |
| Example-based Motion Synthesis via Generative Motion Matching | |
| </h1> | |
| <h3 style="text-align: center; margin-bottom: 7px;"> | |
| <a href="http://weiyuli.xyz/GenMM" target="_blank">Project Page</a> | <a href="https://huggingface.co/papers/2306.00378" target="_blank">Paper</a> | <a href="https://github.com/wyysf-98/GenMM" target="_blank">Code</a> | |
| </h3> | |
| """ | |
| with gr.Blocks() as demo: | |
| gr.HTML(intro) | |
| gr.HTML( | |
| """<iframe src="/GenMM_demo/" width="100%" height="700px" style="border:none;">""" | |
| ) | |
| json_in = gr.JSON(visible=False) | |
| json_out = gr.JSON(visible=False) | |
| btn = gr.Button("Synthesize", visible=False) | |
| btn.click(synthesis, inputs=[json_in], outputs=[json_out], api_name="predict") | |
| app = FastAPI() | |
| static_dir = Path("./GenMM_demo") | |
| app.mount("/GenMM_demo", StaticFiles(directory=static_dir, html=True), name="static") | |
| app = gr.mount_gradio_app(app, demo, path="/") | |
| # serve the app | |
| if __name__ == "__main__": | |
| uvicorn.run("app:app", host="0.0.0.0", port=7860) | |