import gradio as gr
import pandas as pd
from utils import load_all_results
def filter_and_sort_leaderboard(category_filters, sort_by="Video-MME", descending=True):
df = load_all_results()
filtered_df = df[df["Category"].isin(category_filters)]
filtered_df = filtered_df.sort_values(by=sort_by, ascending=not descending).reset_index(drop=True)
filtered_df.insert(0, "Rank", filtered_df.index + 1)
return filtered_df.fillna("-")
def render_html_leaderboard(df):
def row_color(category):
if category == "Proprietary Models":
return "background-color: rgba(255, 255, 153, 0.3);"
elif category == "Open-source Transformer-based LMMs":
return "background-color: rgba(153, 255, 204, 0.3);"
elif category == "Open-source Efficient LMMs":
return "background-color: rgba(204, 229, 255, 0.3);"
return ""
table_html = ""
table_html += "
" + "".join(f"{col} | " for col in df.columns) + "
"
for _, row in df.iterrows():
style = row_color(row['Category'])
row_html = "".join(f"{row[col]} | " for col in df.columns)
table_html += f"{row_html}
"
table_html += "
"
return table_html
def build_interface():
with gr.Blocks() as demo:
gr.Markdown("## 🎥 LVU VLM Leaderboard")
gr.Markdown("Benchmarks: Video-MME, MLVU, LVBench, LongVideoBench")
with gr.Row():
sort_metric = gr.Dropdown(choices=["Video-MME", "MLVU", "LVBench", "LongVideoBench"], label="Sort by", value="Video-MME")
descending = gr.Checkbox(label="Descending", value=True)
with gr.Row():
proprietary = gr.Checkbox(label="Proprietary Models", value=True)
transformer = gr.Checkbox(label="Open-source Transformer-based LMMs", value=True)
efficient = gr.Checkbox(label="Open-source Efficient LMMs", value=True)
default_df = filter_and_sort_leaderboard(
["Proprietary Models", "Open-source Transformer-based LMMs", "Open-source Efficient LMMs"], "Video-MME", True
)
leaderboard = gr.HTML(value=render_html_leaderboard(default_df))
def update_board(sort_by, descending, proprietary, transformer, efficient):
filters = []
if proprietary:
filters.append("Proprietary Models")
if transformer:
filters.append("Open-source Transformer-based LMMs")
if efficient:
filters.append("Open-source Efficient LMMs")
df = filter_and_sort_leaderboard(filters, sort_by, descending)
return render_html_leaderboard(df)
inputs = [sort_metric, descending, proprietary, transformer, efficient]
for inp in inputs:
inp.change(fn=update_board, inputs=inputs, outputs=leaderboard)
return demo
if __name__ == "__main__":
demo = build_interface()
demo.launch()