| import json |
| import gradio as gr |
| import os |
| from fastapi import FastAPI |
| import uvicorn |
| from huggingface_hub import hf_hub_download |
|
|
|
|
| def see_files(path): |
| return os.listdir(path) |
|
|
| def unzip_file(filename): |
| cmd = f"unzip -P lhchensllu ./Movid/{filename} -d ./videos" |
| os.system(cmd) |
|
|
| def greet(name): |
| return "Hello " + name + "!!" |
|
|
| os.system("mkdir Movid") |
| os.system("mkdir videos") |
|
|
| REPO_ID = "EvanTHU/MoVid" |
|
|
| filelist = ["animation", "dance", "haa500", "humman", "idea400", "kungfu", "music", "perform"] |
| for file_ in filelist: |
| filename = f"{file_}-video.zip" |
| file = hf_hub_download(repo_id=REPO_ID, filename=filename, repo_type="dataset", local_dir="./Movid") |
| print(file) |
| unzip_file(filename) |
|
|
| hf_hub_download(repo_id=REPO_ID, filename="video-QA.json", repo_type="dataset", local_dir="./") |
|
|
| print(see_files("./")) |
| print(see_files("./videos")) |
|
|
| |
| with open('video-QA.json', 'r') as f: |
| data = json.load(f) |
|
|
| |
| instructions = [item.get('instruction', 'N/A') for item in data] |
| input_videos = [item.get('input', 'N/A') for item in data] |
| output_captions = [item.get('output', 'N/A') for item in data] |
|
|
| title_markdown = ("""<div class="embed_hidden" style="text-align: center;"> |
| <h1>MoVid Video QA Dataset Visualization</h1> |
| <h3> |
| Dataset contact: |
| <a href="https://lhchen.top" target="_blank" rel="noopener noreferrer">Ling-Hao Chen</a> (THU, IDEA), |
| <a href="https://shunlinlu.github.io" target="_blank" rel="noopener noreferrer">Shunlin Lu</a> (CUHK-SZ, IDEA), |
| Other contributors: Yuhong Zhang (THU, IDEA). |
| </h3> |
| </div> |
| """) |
|
|
| |
| def get_subdirs(directory): |
| list_ = [d for d in os.listdir(directory) if os.path.isdir(os.path.join(directory, d))] |
| for item in list_: |
| if "idea400-release" in item: |
| list_.remove(item) |
| return list_ |
|
|
| |
| def get_next_level(directory): |
| items = os.listdir(directory) |
| subdirs = [d for d in items if os.path.isdir(os.path.join(directory, d))] |
| videos = [f for f in items if f.endswith('.mp4')] |
| return subdirs, videos |
|
|
| |
| def display_video(subset1, subset2, video): |
| index = input_videos.index(f"./videos/{subset1}/{subset2}/{video}") |
| instruction = instructions[index] |
| input_video = f"./videos/{subset1}/{subset2}/{video}" |
| output_caption = output_captions[index] |
| return instruction, input_video, output_caption |
|
|
| |
| def create_demo(): |
| with gr.Blocks() as demo: |
| css = """.large-font{ font-size: 40px; } |
| .gr-video{ width: 70%; max-width: 640px; height: auto; } |
| """ |
| |
| gr.Markdown(title_markdown) |
| |
| root_dir = "./videos" |
| subset1_dirs = get_subdirs(root_dir) |
| |
| with gr.Row(): |
| subset1 = gr.Dropdown(choices=subset1_dirs, label="Select MoVid Subset") |
| subset2 = gr.Dropdown(choices=[], label="Select Split") |
| video = gr.Dropdown(choices=[], label="Select Video File") |
| |
| instruction_output = gr.Textbox(label="Question", elem_classes=["large-font"]) |
| caption_output = gr.Textbox(label="Answer", elem_classes=["large-font"]) |
| video_output = gr.Video(label="Input Video", elem_classes=["large-font"]) |
| |
| def update_subset2(subset1): |
| subset2_dirs, _ = get_next_level(os.path.join(root_dir, subset1)) |
| return gr.Dropdown(choices=subset2_dirs, interactive=True), gr.Dropdown(choices=[], interactive=True) |
|
|
| def update_videos(subset1, subset2): |
| _, videos = get_next_level(os.path.join(root_dir, subset1, subset2)) |
| return gr.Dropdown(choices=videos, interactive=True) |
| |
| subset1.change(update_subset2, inputs=subset1, outputs=[subset2, video]) |
| subset2.change(update_videos, inputs=[subset1, subset2], outputs=video) |
| video.change(display_video, inputs=[subset1, subset2, video], outputs=[instruction_output, video_output, caption_output]) |
| |
| return demo |
|
|
| |
| demo = create_demo() |
| |
| demo.launch() |