Spaces:
Running
Running
yuhan Zhang
commited on
Commit
ยท
f216956
1
Parent(s):
de9cce7
upload leaderboard
Browse files- app.py +62 -0
- leaderboards/object_hi3deval.csv +22 -0
- requirements.txt +70 -0
- serve/__pycache__/css.cpython-310.pyc +0 -0
- serve/__pycache__/leaderboard.cpython-310.pyc +0 -0
- serve/__pycache__/leaderboard.cpython-39.pyc +0 -0
- serve/__pycache__/markdown.cpython-310.pyc +0 -0
- serve/__pycache__/markdown.cpython-39.pyc +0 -0
- serve/__pycache__/model.cpython-310.pyc +0 -0
- serve/__pycache__/model.cpython-39.pyc +0 -0
- serve/css.py +66 -0
- serve/leaderboard.py +96 -0
- serve/markdown.py +125 -0
- serve/model.py +353 -0
- serve/tmp.py +379 -0
app.py
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import os
|
| 3 |
+
import json
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
|
| 6 |
+
from serve.css import block_css
|
| 7 |
+
from serve.markdown import *
|
| 8 |
+
from serve.leaderboard import build_leaderboard_tab
|
| 9 |
+
from serve.model import model_config
|
| 10 |
+
# SERVER_PORT, ROOT_PATH, ELO_RESULTS_DIR
|
| 11 |
+
SERVER_PORT = 7860
|
| 12 |
+
LEADERBOARD_DIR = "leaderboards"
|
| 13 |
+
|
| 14 |
+
def build_combine_demo():
|
| 15 |
+
with gr.Blocks(
|
| 16 |
+
title="",
|
| 17 |
+
theme=gr.themes.Default(),
|
| 18 |
+
css=block_css,
|
| 19 |
+
) as demo:
|
| 20 |
+
gr.Markdown(get_title_md(), elem_id="title_markdown")
|
| 21 |
+
gr.Markdown(get_intro_md(), elem_id="intro_markdown")
|
| 22 |
+
|
| 23 |
+
gr.Markdown("Models", elem_id="subtitle_markdown")
|
| 24 |
+
gr.Markdown(get_model_intro_md(), elem_id="intro_markdown")
|
| 25 |
+
with gr.Accordion("๐ Expand to see detailed generative models involved", open=False):
|
| 26 |
+
gr.Markdown(get_model_description_md(model_config), elem_id="model_description_markdown")
|
| 27 |
+
|
| 28 |
+
gr.Markdown("Criteria", elem_id="subtitle_markdown")
|
| 29 |
+
gr.Markdown(get_object_dimension_intro_md(), elem_id="intro_markdown")
|
| 30 |
+
with gr.Accordion("๐ Expand to see detailed evaluation dimensions", open=False):
|
| 31 |
+
gr.Markdown(get_object_dimension_description_md(), elem_id="evaldim_markdown")
|
| 32 |
+
|
| 33 |
+
gr.Markdown("Leaderboard", elem_id="subtitle_markdown")
|
| 34 |
+
# gr.Markdown(get_leaderboard_intro_md(), elem_id="intro_markdown")
|
| 35 |
+
with gr.Tab("Hi3DEval"):
|
| 36 |
+
gr.Markdown(get_hi3deval_intro_md(), elem_id="intro_markdown")
|
| 37 |
+
hi3deval_leaderboard_file = gr.Textbox(value=os.path.join(LEADERBOARD_DIR, "object_hi3deval.csv"), visible=False)
|
| 38 |
+
hi3deval_task_dropdown = gr.Dropdown(
|
| 39 |
+
label="Choose Task",
|
| 40 |
+
choices=["Full Leaderboard", "Text-to-3D only", "Image-to-3D only"],
|
| 41 |
+
value="Full Leaderboard", # ้ป่ฎคๅผ
|
| 42 |
+
interactive=True, # ๅฏไบคไบ
|
| 43 |
+
multiselect=False # ๅ้
|
| 44 |
+
)
|
| 45 |
+
hi3deval_leaderboard_table = build_leaderboard_tab(hi3deval_leaderboard_file)
|
| 46 |
+
gr.Markdown(get_citation_md("hi3deval"), elem_id="ack_markdown")
|
| 47 |
+
|
| 48 |
+
# with gr.Tab("Image-to-3D Generation", id=1):
|
| 49 |
+
# build_leaderboard_tab()
|
| 50 |
+
|
| 51 |
+
hi3deval_task_dropdown.change(
|
| 52 |
+
build_leaderboard_tab,
|
| 53 |
+
[hi3deval_leaderboard_file, hi3deval_task_dropdown],
|
| 54 |
+
hi3deval_leaderboard_table
|
| 55 |
+
)
|
| 56 |
+
return demo
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
if __name__ == "__main__":
|
| 60 |
+
demo = build_combine_demo()
|
| 61 |
+
# demo.queue(max_size=20).launch(server_port=server_port, root_path=ROOT_PATH, debug=True)
|
| 62 |
+
demo.queue(max_size=20).launch(server_port=SERVER_PORT, debug=True)
|
leaderboards/object_hi3deval.csv
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Method,Task,Geometry Plausibility,Geometry Details,Texture Quality,Geo.-Tex. Coherence,Prompt-3D Alignment,Overall
|
| 2 |
+
hunyuan3d-2.0,"Image-to-3D",6.2919,2.7215,2.7644,0.9876,3.4334,16.1988
|
| 3 |
+
trellis,"Image-to-3D",5.8626,2.392,2.4693,0.9702,3.5048,15.1989
|
| 4 |
+
spar3d,"Image-to-3D",5.7791,2.3031,2.4749,0.9601,3.4842,15.0014
|
| 5 |
+
triposr,"Image-to-3D",5.2216,2.4225,2.3758,0.9562,3.3643,14.3404
|
| 6 |
+
instantmesh,"Image-to-3D",5.4242,2.2252,2.3063,0.9587,3.363,14.2775
|
| 7 |
+
crm,"Image-to-3D",4.745,2.2991,2.3777,0.9164,3.219,13.5572
|
| 8 |
+
mvdream,"Text-to-3D",4.4064,2.742,2.8116,0.951,2.5879,13.4989
|
| 9 |
+
unique3d,"Image-to-3D",4.9288,2.3233,1.9627,0.776,3.1989,13.1897
|
| 10 |
+
openlrm,"Image-to-3D",3.7754,2.2614,2.0922,0.902,2.2298,11.2608
|
| 11 |
+
wonder3d,"Image-to-3D",3.7879,2.0092,1.9658,0.9255,2.0874,10.7758
|
| 12 |
+
sz123,"Image-to-3D",3.6052,1.6548,2.0293,0.8902,2.2578,10.4374
|
| 13 |
+
magic123,"Image-to-3D",3.4617,1.74,2.0094,0.898,2.2171,10.3262
|
| 14 |
+
grm-i,"Image-to-3D",3.2932,1.857,1.8885,0.849,2.0735,9.9612
|
| 15 |
+
lgm,"Image-to-3D",3.2148,1.6733,1.8891,0.8118,2.0304,9.6193
|
| 16 |
+
lucid-dreamer,"Text-to-3D",2.9346,1.5891,2.1069,0.8333,2.0297,9.4936
|
| 17 |
+
grm-t,"Text-to-3D",3.0096,1.6627,1.7389,0.898,1.793,9.1023
|
| 18 |
+
latent-nerf,"Text-to-3D",2.7265,1.7067,1.7065,0.8412,1.7688,8.7497
|
| 19 |
+
magic3d,"Text-to-3D",2.9015,1.6239,1.5395,0.9431,1.5618,8.5698
|
| 20 |
+
syncdreamer,"Image-to-3D",2.9423,1.5323,1.2134,0.8529,1.2776,7.8185
|
| 21 |
+
dreamfusion,"Text-to-3D",2.669,1.2525,1.183,0.9137,1.3446,7.3627
|
| 22 |
+
triplane-gaussian,"Image-to-3D",2.2948,1.1859,1.2028,0.6647,1.2908,6.6389
|
requirements.txt
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
aiofiles==23.2.1
|
| 2 |
+
altair==5.5.0
|
| 3 |
+
annotated-types==0.7.0
|
| 4 |
+
anyio==4.9.0
|
| 5 |
+
attrs==25.3.0
|
| 6 |
+
Brotli==1.1.0
|
| 7 |
+
certifi==2025.7.14
|
| 8 |
+
charset-normalizer==3.4.2
|
| 9 |
+
click==8.2.1
|
| 10 |
+
contourpy==1.3.2
|
| 11 |
+
cycler==0.12.1
|
| 12 |
+
exceptiongroup==1.3.0
|
| 13 |
+
fastapi==0.116.1
|
| 14 |
+
ffmpy==0.6.1
|
| 15 |
+
filelock==3.18.0
|
| 16 |
+
fonttools==4.59.0
|
| 17 |
+
fsspec==2025.7.0
|
| 18 |
+
gradio==4.44.1
|
| 19 |
+
gradio_client==1.3.0
|
| 20 |
+
groovy==0.1.2
|
| 21 |
+
h11==0.16.0
|
| 22 |
+
hf-xet==1.1.5
|
| 23 |
+
httpcore==1.0.9
|
| 24 |
+
httpx==0.28.1
|
| 25 |
+
huggingface-hub==0.34.1
|
| 26 |
+
idna==3.10
|
| 27 |
+
importlib_resources==6.5.2
|
| 28 |
+
Jinja2==3.1.6
|
| 29 |
+
jsonschema==4.25.0
|
| 30 |
+
jsonschema-specifications==2025.4.1
|
| 31 |
+
kiwisolver==1.4.8
|
| 32 |
+
markdown-it-py==3.0.0
|
| 33 |
+
MarkupSafe==2.1.5
|
| 34 |
+
matplotlib==3.10.3
|
| 35 |
+
mdurl==0.1.2
|
| 36 |
+
narwhals==1.48.1
|
| 37 |
+
numpy==1.26.0
|
| 38 |
+
orjson==3.11.1
|
| 39 |
+
packaging==25.0
|
| 40 |
+
pandas==2.3.1
|
| 41 |
+
pillow==10.4.0
|
| 42 |
+
pydantic==2.11.7
|
| 43 |
+
pydantic_core==2.33.2
|
| 44 |
+
pydub==0.25.1
|
| 45 |
+
Pygments==2.19.2
|
| 46 |
+
pyparsing==3.2.3
|
| 47 |
+
python-dateutil==2.9.0.post0
|
| 48 |
+
python-multipart==0.0.20
|
| 49 |
+
pytz==2025.2
|
| 50 |
+
PyYAML==6.0.2
|
| 51 |
+
referencing==0.36.2
|
| 52 |
+
requests==2.32.4
|
| 53 |
+
rich==14.1.0
|
| 54 |
+
rpds-py==0.26.0
|
| 55 |
+
ruff==0.12.5
|
| 56 |
+
safehttpx==0.1.6
|
| 57 |
+
semantic-version==2.10.0
|
| 58 |
+
shellingham==1.5.4
|
| 59 |
+
six==1.17.0
|
| 60 |
+
sniffio==1.3.1
|
| 61 |
+
starlette==0.47.2
|
| 62 |
+
tomlkit==0.12.0
|
| 63 |
+
tqdm==4.67.1
|
| 64 |
+
typer==0.16.0
|
| 65 |
+
typing-inspection==0.4.1
|
| 66 |
+
typing_extensions==4.14.1
|
| 67 |
+
tzdata==2025.2
|
| 68 |
+
urllib3==2.5.0
|
| 69 |
+
uvicorn==0.35.0
|
| 70 |
+
websockets==11.0.3
|
serve/__pycache__/css.cpython-310.pyc
ADDED
|
Binary file (1.42 kB). View file
|
|
|
serve/__pycache__/leaderboard.cpython-310.pyc
ADDED
|
Binary file (3.2 kB). View file
|
|
|
serve/__pycache__/leaderboard.cpython-39.pyc
ADDED
|
Binary file (3.33 kB). View file
|
|
|
serve/__pycache__/markdown.cpython-310.pyc
ADDED
|
Binary file (5.28 kB). View file
|
|
|
serve/__pycache__/markdown.cpython-39.pyc
ADDED
|
Binary file (674 Bytes). View file
|
|
|
serve/__pycache__/model.cpython-310.pyc
ADDED
|
Binary file (5.39 kB). View file
|
|
|
serve/__pycache__/model.cpython-39.pyc
ADDED
|
Binary file (3.07 kB). View file
|
|
|
serve/css.py
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
block_css = """
|
| 2 |
+
#title_markdown * {
|
| 3 |
+
font-size: 125% !important;
|
| 4 |
+
font-weight: bold;
|
| 5 |
+
text-align: center;
|
| 6 |
+
margin-bottom: 12px;
|
| 7 |
+
}
|
| 8 |
+
#subtitle_markdown * {
|
| 9 |
+
font-size: 110% !important;
|
| 10 |
+
font-weight: bold;
|
| 11 |
+
text-align: left;
|
| 12 |
+
margin-bottom: 2px;
|
| 13 |
+
}
|
| 14 |
+
#intro_markdown * {
|
| 15 |
+
font-size: 102% !important;
|
| 16 |
+
line-height: 1.2;
|
| 17 |
+
}
|
| 18 |
+
#model_description_markdown * {
|
| 19 |
+
font-size: 102% !important;
|
| 20 |
+
}
|
| 21 |
+
#model_description_markdown th {
|
| 22 |
+
display: none;
|
| 23 |
+
}
|
| 24 |
+
#model_description_markdown tr {
|
| 25 |
+
border: none !important;
|
| 26 |
+
}
|
| 27 |
+
#model_description_markdown table,
|
| 28 |
+
#model_description_markdown td {
|
| 29 |
+
font-size: 100% !important;
|
| 30 |
+
border: none !important;
|
| 31 |
+
outline: none !important;
|
| 32 |
+
box-shadow: none !important;
|
| 33 |
+
background: none !important;
|
| 34 |
+
padding-top: 6px;
|
| 35 |
+
padding-bottom: 6px;
|
| 36 |
+
}
|
| 37 |
+
#evaldim_markdown * {
|
| 38 |
+
font-size: 102% !important;
|
| 39 |
+
line-height: 1.4;
|
| 40 |
+
}
|
| 41 |
+
#about_markdown {
|
| 42 |
+
font-size: 110%
|
| 43 |
+
}
|
| 44 |
+
#ack_markdown {
|
| 45 |
+
font-size: 100%
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
#leaderboard_markdown {
|
| 49 |
+
font-size: 110%
|
| 50 |
+
}
|
| 51 |
+
#leaderboard_markdown td {
|
| 52 |
+
padding-top: 6px;
|
| 53 |
+
padding-bottom: 6px;
|
| 54 |
+
}
|
| 55 |
+
#leaderboard_dataframe td {
|
| 56 |
+
line-height: 0.1em;
|
| 57 |
+
font-weight: bold;
|
| 58 |
+
}
|
| 59 |
+
#input_box textarea {
|
| 60 |
+
font-weight: bold;
|
| 61 |
+
font-size: 125%;
|
| 62 |
+
}
|
| 63 |
+
footer {
|
| 64 |
+
display:none !important
|
| 65 |
+
}
|
| 66 |
+
"""
|
serve/leaderboard.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import argparse
|
| 2 |
+
import ast
|
| 3 |
+
import pickle
|
| 4 |
+
import os
|
| 5 |
+
import threading
|
| 6 |
+
import time
|
| 7 |
+
|
| 8 |
+
import gradio as gr
|
| 9 |
+
import numpy as np
|
| 10 |
+
import pandas as pd
|
| 11 |
+
from serve.model import model_config
|
| 12 |
+
|
| 13 |
+
def hyperlink(name, link):
|
| 14 |
+
return f'<a target="_blank" href="{link}" style="color: var(--link-text-color); \
|
| 15 |
+
text-decoration: underline;text-decoration-style: dotted;">{name}</a>'
|
| 16 |
+
|
| 17 |
+
def amend_model_name(name, rank):
|
| 18 |
+
model_name = model_config[name].model_name
|
| 19 |
+
if rank==1:
|
| 20 |
+
return "๐ฅ " + model_name
|
| 21 |
+
elif rank==2:
|
| 22 |
+
return "๐ฅ " + model_name
|
| 23 |
+
elif rank==3:
|
| 24 |
+
return '๐ฅ ' + model_name
|
| 25 |
+
else:
|
| 26 |
+
return model_name
|
| 27 |
+
|
| 28 |
+
def get_cfg_info(name):
|
| 29 |
+
config = model_config[name]
|
| 30 |
+
links = []
|
| 31 |
+
if config.page_link:
|
| 32 |
+
links.append(hyperlink("Page", config.page_link))
|
| 33 |
+
if config.code_link:
|
| 34 |
+
links.append(hyperlink("Code", config.code_link))
|
| 35 |
+
return ", ".join(links) if links else "N/A", config.organization if config.organization else "N/A"
|
| 36 |
+
|
| 37 |
+
def get_leaderboard_values(leaderboard_df):
|
| 38 |
+
leaderboard_vals = []
|
| 39 |
+
for i, row in leaderboard_df.iterrows():
|
| 40 |
+
rank = i+1
|
| 41 |
+
model_name = row["Method"]
|
| 42 |
+
task = row["Task"]
|
| 43 |
+
if model_name not in model_config.keys() or model_config[model_name].task != task:
|
| 44 |
+
continue
|
| 45 |
+
|
| 46 |
+
values = [rank, amend_model_name(model_name, rank), task]
|
| 47 |
+
values = values + [row.get(dim, np.NaN) for dim in leaderboard_df.columns[2:]]
|
| 48 |
+
# values.append(round(np.sum([v for v in values[3:] if pd.notna(v)]), 4))
|
| 49 |
+
|
| 50 |
+
links, organization = get_cfg_info(model_name)
|
| 51 |
+
# values.append(links)
|
| 52 |
+
values.append(organization)
|
| 53 |
+
|
| 54 |
+
leaderboard_vals.append(values)
|
| 55 |
+
return leaderboard_vals
|
| 56 |
+
|
| 57 |
+
def get_topk_ranks(df, k=3):
|
| 58 |
+
ranks = {}
|
| 59 |
+
for col_idx, col in enumerate(df.columns[2:]): # skip "Model" โTask"
|
| 60 |
+
topk = df[col].nlargest(k)
|
| 61 |
+
for rank, idx in enumerate(topk.index):
|
| 62 |
+
if idx not in ranks:
|
| 63 |
+
ranks[idx] = {}
|
| 64 |
+
ranks[idx][col_idx] = rank + 1 # 1-based rank
|
| 65 |
+
for i in range(k): ranks[i][5] = i + 1
|
| 66 |
+
return ranks # dict: row -> {col: rank}
|
| 67 |
+
|
| 68 |
+
def build_leaderboard_tab(leaderboard_file: str, task: str = ""):
|
| 69 |
+
if not isinstance(leaderboard_file, str):
|
| 70 |
+
leaderboard_file = leaderboard_file.value
|
| 71 |
+
if not isinstance(task, str):
|
| 72 |
+
task = task.value
|
| 73 |
+
|
| 74 |
+
df = pd.read_csv(leaderboard_file)
|
| 75 |
+
if task in ["Text-to-3D only", "Image-to-3D only"]:
|
| 76 |
+
df = df[df["Task"] == task.split()[0]]
|
| 77 |
+
# df = df.drop(df[df["Task"]!=task.split()[0]].index)
|
| 78 |
+
leaderboard_df = df.drop(df[df["Method"].isnull()].index)
|
| 79 |
+
leaderboard_df = leaderboard_df.reset_index(drop=True)
|
| 80 |
+
|
| 81 |
+
leaderboard_vals = get_leaderboard_values(leaderboard_df)
|
| 82 |
+
leaderboard = gr.Dataframe(
|
| 83 |
+
headers = ['Rank', "๐ค Model", "๐ชง Task" ]
|
| 84 |
+
+ [f"{dim}" for dim in leaderboard_df.keys()[2:-1]]
|
| 85 |
+
+ ["โญ Overall", "๐๏ธ Orgnization"], # "๐ Links",
|
| 86 |
+
datatype = ["number", "str", "str"]
|
| 87 |
+
+ ["number"] * (len(leaderboard_df.columns) - 3)
|
| 88 |
+
+ ["number", "str"],
|
| 89 |
+
value = leaderboard_vals,
|
| 90 |
+
height = 680,
|
| 91 |
+
column_widths = [60, 140, 100]
|
| 92 |
+
+ [120] * (len(leaderboard_df.columns) - 3)
|
| 93 |
+
+ [120, 160],
|
| 94 |
+
wrap = True,
|
| 95 |
+
)
|
| 96 |
+
return leaderboard
|
serve/markdown.py
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
def hyperlink(name, link):
|
| 3 |
+
return f'<a target="_blank" href="{link}" style="color: var(--link-text-color); \
|
| 4 |
+
text-decoration: underline;text-decoration-style: dotted;">{name}</a>'
|
| 5 |
+
|
| 6 |
+
def get_title_md():
|
| 7 |
+
md = f'''
|
| 8 |
+
# ๐ Leaderboard for 3D Generative Models
|
| 9 |
+
'''
|
| 10 |
+
return md
|
| 11 |
+
|
| 12 |
+
def get_intro_md():
|
| 13 |
+
md = '''
|
| 14 |
+
This leaderboard provides a centralized evaluation platform for evaluating and tracking the performance of 3D generation models.
|
| 15 |
+
'''
|
| 16 |
+
return md
|
| 17 |
+
|
| 18 |
+
def get_model_intro_md():
|
| 19 |
+
md = '''
|
| 20 |
+
This leaderboard spans a diverse set of state-of-the-art 3D generation models, including different conditional settings such as images, text, or combinations thereof.
|
| 21 |
+
'''
|
| 22 |
+
return md
|
| 23 |
+
|
| 24 |
+
def get_model_description_md(model_config, cols=10, except_models=[]):
|
| 25 |
+
model_list = {}
|
| 26 |
+
for cfg in model_config.values():
|
| 27 |
+
task = cfg.task
|
| 28 |
+
model_name = cfg.model_name
|
| 29 |
+
model_link = cfg.page_link if cfg.page_link else cfg.code_link
|
| 30 |
+
if task not in model_list.keys():
|
| 31 |
+
model_list[task] = set()
|
| 32 |
+
if model_name not in except_models:
|
| 33 |
+
model_list[task].add(hyperlink(model_name, model_link))
|
| 34 |
+
|
| 35 |
+
model_descriptions = ""
|
| 36 |
+
for task, models in model_list.items():
|
| 37 |
+
model_descriptions += f"\n**{len(models)} {task} Generative Models**\n"
|
| 38 |
+
## model_table
|
| 39 |
+
|
| 40 |
+
model_descriptions += '<table style="width:100%; text-align:left; border:none; border-collapse: collapse;">\n'
|
| 41 |
+
for i, model in enumerate(models):
|
| 42 |
+
if i%cols == 0:
|
| 43 |
+
model_descriptions += ' <tr>\n'
|
| 44 |
+
model_descriptions += f' <td>{model}</td>\n'
|
| 45 |
+
if (i+1)%cols == 0:
|
| 46 |
+
model_descriptions += ' </tr>\n'
|
| 47 |
+
if len(models)%cols != 0:
|
| 48 |
+
num_pad = cols - len(models)%cols
|
| 49 |
+
model_descriptions += ' <td></td>\n' * num_pad
|
| 50 |
+
model_descriptions += ' </tr>\n'
|
| 51 |
+
model_descriptions += '</table>\n'
|
| 52 |
+
return model_descriptions.strip()
|
| 53 |
+
|
| 54 |
+
def get_object_dimension_intro_md():
|
| 55 |
+
md = f'''
|
| 56 |
+
Each model involved is conducted under consistent and standardized settings and assessed along **multiple evaluation dimensions** to provide a detailed view of its strengths and limitations:
|
| 57 |
+
'''
|
| 58 |
+
return md
|
| 59 |
+
|
| 60 |
+
def get_object_dimension_description_md():
|
| 61 |
+
md = f'''
|
| 62 |
+
- **Geometry Plausibility** assesses the structural integrity and physical feasibility of the generated shape.
|
| 63 |
+
- **Geometry Details** reflects the fidelity of fine-scale structures, such as sharp edges and part boundaries.
|
| 64 |
+
- **Texture Quality** evaluates the visual fidelity of surface textures in terms of resolution, realism, and aesthetic consistency.
|
| 65 |
+
- **Geometry-Texture Coherency** assesses the alignment between texture and shapeโwhether textures follow the contours, part boundaries, and material semantics of geometry.
|
| 66 |
+
- **Prompt-3D Alignment** evaluates the semantic and/or identity consistency between the input prompt and the generated 3D asset.
|
| 67 |
+
'''
|
| 68 |
+
return md
|
| 69 |
+
|
| 70 |
+
def get_leaderboard_intro_md():
|
| 71 |
+
md = '''
|
| 72 |
+
This leaderboard integrates results from three complementary benchmarks that span different aspects of 3D synthesis.
|
| 73 |
+
- [Hi3DEval]()
|
| 74 |
+
- [3DGenBench](https://zyh482.github.io/3DGen-Bench/)
|
| 75 |
+
- [GPTEval3D](https://github.com/3DTopia/GPTEval3D)
|
| 76 |
+
'''
|
| 77 |
+
return md
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
def get_hi3deval_intro_md(num_model=None):
|
| 81 |
+
md = f'''
|
| 82 |
+
This leaderboard is evaluated using **Hi3DEval**, a straight forward scoring benchmark that does **not rely on pairwise comparisons**.
|
| 83 |
+
|
| 84 |
+
Specifically, each dimension is assigned an absolute score within clearly defined value ranges:
|
| 85 |
+
|
| 86 |
+
- Geometry Plausibility: range [0, 9]
|
| 87 |
+
- Geometry Details: range [0, 4]
|
| 88 |
+
- Texture Quality: range [0, 4]
|
| 89 |
+
- Geometry-Texture Coherency: range [0, 1]
|
| 90 |
+
- Prompt-3D Alignment: range [0, 4]
|
| 91 |
+
|
| 92 |
+
The **Overall Score** is computed as the **SUM** of the scores across all five dimensions.
|
| 93 |
+
|
| 94 |
+
Hi3DEval supports unified evaluation for both **Text-to-3D** and **Image-to-3D** generation tasks. You can also freely select **"Task"** to explore performance under different input modalities.
|
| 95 |
+
'''
|
| 96 |
+
return md
|
| 97 |
+
|
| 98 |
+
def get_citation_md(name):
|
| 99 |
+
citations = {
|
| 100 |
+
"hi3deval": '''
|
| 101 |
+
```bibtex
|
| 102 |
+
@article
|
| 103 |
+
''',
|
| 104 |
+
"3dgen-bench": '''
|
| 105 |
+
```bibtex
|
| 106 |
+
@article{zhang20253dgen,
|
| 107 |
+
title={3DGen-Bench: Comprehensive Benchmark Suite for 3D Generative Models},
|
| 108 |
+
author={Zhang, Yuhan and Zhang, Mengchen and Wu, Tong and Wang, Tengfei and Wetzstein, Gordon and Lin, Dahua and Liu, Ziwei},
|
| 109 |
+
journal={arXiv preprint arXiv:2503.21745},
|
| 110 |
+
year={2025}
|
| 111 |
+
}
|
| 112 |
+
''',
|
| 113 |
+
"gpteval3d": '''
|
| 114 |
+
```bibtex
|
| 115 |
+
@inproceedings{wu2024gpt,
|
| 116 |
+
title={Gpt-4v (ision) is a human-aligned evaluator for text-to-3d generation},
|
| 117 |
+
author={Wu, Tong and Yang, Guandao and Li, Zhibing and Zhang, Kai and Liu, Ziwei and Guibas, Leonidas and Lin, Dahua and Wetzstein, Gordon},
|
| 118 |
+
booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition},
|
| 119 |
+
pages={22227--22238},
|
| 120 |
+
year={2024}
|
| 121 |
+
}
|
| 122 |
+
'''
|
| 123 |
+
}
|
| 124 |
+
md = f"Reference:\n{citations[name.lower()]}"
|
| 125 |
+
return md
|
serve/model.py
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from collections import namedtuple
|
| 2 |
+
from typing import List
|
| 3 |
+
|
| 4 |
+
ModelConfig = namedtuple("ModelConfig", ["model_name", "task", "representation", "paradigm", "page_link", "code_link", "organization"])
|
| 5 |
+
model_config = {}
|
| 6 |
+
|
| 7 |
+
def register_model_config(
|
| 8 |
+
nick_name:str, model_name: str, task: str, representation: str, paradigm: str = None, page_link: str = None, code_link: str = None, organization: str = None
|
| 9 |
+
):
|
| 10 |
+
config = ModelConfig(model_name, task, representation, paradigm, page_link, code_link, organization)
|
| 11 |
+
model_config[nick_name] = config
|
| 12 |
+
|
| 13 |
+
def get_model_config(model_name: str) -> ModelConfig:
|
| 14 |
+
assert model_name in model_config
|
| 15 |
+
return model_config[model_name]
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
### Registering model configurations for TExt-to-3D models
|
| 19 |
+
|
| 20 |
+
register_model_config(
|
| 21 |
+
nick_name="dreamfusion",
|
| 22 |
+
model_name="DreamFusion",
|
| 23 |
+
task="Text-to-3D",
|
| 24 |
+
representation="NeRF",
|
| 25 |
+
paradigm="Optimazation",
|
| 26 |
+
page_link="https://dreamfusion3d.github.io/",
|
| 27 |
+
code_link="",
|
| 28 |
+
organization="Google Research"
|
| 29 |
+
)
|
| 30 |
+
|
| 31 |
+
register_model_config(
|
| 32 |
+
nick_name="sjc",
|
| 33 |
+
model_name="SJC",
|
| 34 |
+
task="Text-to-3D",
|
| 35 |
+
representation="Voxel NeRF",
|
| 36 |
+
paradigm="Optimization",
|
| 37 |
+
page_link="https://pals.ttic.edu/p/score-jacobian-chaining",
|
| 38 |
+
code_link="https://github.com/pals-ttic/sjc",
|
| 39 |
+
organization="TTI-Chicago"
|
| 40 |
+
)
|
| 41 |
+
|
| 42 |
+
register_model_config(
|
| 43 |
+
nick_name="latent-nerf",
|
| 44 |
+
model_name="Latent-NeRF",
|
| 45 |
+
task="Text-to-3D",
|
| 46 |
+
representation="NeRF",
|
| 47 |
+
paradigm="Optimization",
|
| 48 |
+
page_link="",
|
| 49 |
+
code_link="https://github.com/eladrich/latent-nerf",
|
| 50 |
+
organization="Tel Aviv University"
|
| 51 |
+
)
|
| 52 |
+
|
| 53 |
+
register_model_config(
|
| 54 |
+
nick_name="magic3d",
|
| 55 |
+
model_name="Magic3D",
|
| 56 |
+
task="Text-to-3D",
|
| 57 |
+
representation="",
|
| 58 |
+
paradigm="",
|
| 59 |
+
page_link="https://research.nvidia.com/labs/dir/magic3d/",
|
| 60 |
+
code_link="",
|
| 61 |
+
organization="Nvidia"
|
| 62 |
+
)
|
| 63 |
+
|
| 64 |
+
register_model_config(
|
| 65 |
+
nick_name="lucid-dreamer",
|
| 66 |
+
model_name="LucidDreamer",
|
| 67 |
+
task="Text-to-3D",
|
| 68 |
+
representation="",
|
| 69 |
+
paradigm="",
|
| 70 |
+
page_link="https://luciddreamer-cvlab.github.io/",
|
| 71 |
+
code_link="https://github.com/luciddreamer-cvlab/LucidDreamer",
|
| 72 |
+
organization="Computer Vision Lab, Seoul National University "
|
| 73 |
+
)
|
| 74 |
+
|
| 75 |
+
register_model_config(
|
| 76 |
+
nick_name="mvdream",
|
| 77 |
+
model_name="MVDream",
|
| 78 |
+
task="Text-to-3D",
|
| 79 |
+
representation="",
|
| 80 |
+
paradigm="",
|
| 81 |
+
page_link="https://mv-dream.github.io/",
|
| 82 |
+
code_link="https://github.com/bytedance/MVDream",
|
| 83 |
+
organization="ByteDance"
|
| 84 |
+
)
|
| 85 |
+
|
| 86 |
+
register_model_config(
|
| 87 |
+
nick_name="grm-t",
|
| 88 |
+
model_name="GRM",
|
| 89 |
+
task="Text-to-3D",
|
| 90 |
+
representation="",
|
| 91 |
+
paradigm="",
|
| 92 |
+
page_link="https://justimyhxu.github.io/projects/grm/",
|
| 93 |
+
code_link="https://github.com/justimyhxu/grm",
|
| 94 |
+
organization="Stanford Univerity"
|
| 95 |
+
)
|
| 96 |
+
|
| 97 |
+
register_model_config(
|
| 98 |
+
nick_name="point-e-t",
|
| 99 |
+
model_name="Point-E",
|
| 100 |
+
task="Text-to-3D",
|
| 101 |
+
representation="",
|
| 102 |
+
paradigm="",
|
| 103 |
+
page_link="https://openai.com/index/point-e/",
|
| 104 |
+
code_link="https://github.com/openai/point-e",
|
| 105 |
+
organization="OpenAI"
|
| 106 |
+
)
|
| 107 |
+
|
| 108 |
+
register_model_config(
|
| 109 |
+
nick_name="shap-e-t",
|
| 110 |
+
model_name="Shap-E",
|
| 111 |
+
task="Text-to-3D",
|
| 112 |
+
representation="",
|
| 113 |
+
paradigm="",
|
| 114 |
+
page_link="",
|
| 115 |
+
code_link="https://github.com/openai/shap-e",
|
| 116 |
+
organization="OpenAI"
|
| 117 |
+
)
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
## Registering model configurations for Image-to-3D models
|
| 121 |
+
register_model_config(
|
| 122 |
+
nick_name="trellis",
|
| 123 |
+
model_name="TRELLIS",
|
| 124 |
+
task="Image-to-3D",
|
| 125 |
+
representation="",
|
| 126 |
+
paradigm="Naive 3DGen",
|
| 127 |
+
page_link="https://microsoft.github.io/TRELLIS/",
|
| 128 |
+
code_link="https://github.com/Microsoft/TRELLIS",
|
| 129 |
+
organization="Microsoft Research"
|
| 130 |
+
)
|
| 131 |
+
register_model_config(
|
| 132 |
+
nick_name="hunyuan3d-2.0",
|
| 133 |
+
model_name="Hunyuan3D 2.0",
|
| 134 |
+
task="Image-to-3D",
|
| 135 |
+
representation="Mesh",
|
| 136 |
+
paradigm="Naive 3DGen",
|
| 137 |
+
page_link="https://3d-models.hunyuan.tencent.com/",
|
| 138 |
+
code_link="https://github.com/Tencent-Hunyuan/Hunyuan3D-2",
|
| 139 |
+
organization="Tencent Hunyuan3D Team"
|
| 140 |
+
)
|
| 141 |
+
register_model_config(
|
| 142 |
+
nick_name="hunyuan3d-2.5",
|
| 143 |
+
model_name="Hunyuan3D 2.5",
|
| 144 |
+
task="Image-to-3D",
|
| 145 |
+
representation="",
|
| 146 |
+
paradigm="",
|
| 147 |
+
page_link="",
|
| 148 |
+
code_link="",
|
| 149 |
+
organization="Tencent Hunyuan3D Team"
|
| 150 |
+
)
|
| 151 |
+
register_model_config(
|
| 152 |
+
nick_name="spar3d",
|
| 153 |
+
model_name="SPAR3D",
|
| 154 |
+
task="Image-to-3D",
|
| 155 |
+
representation="",
|
| 156 |
+
paradigm="",
|
| 157 |
+
page_link="https://spar3d.github.io/",
|
| 158 |
+
code_link="https://github.com/Stability-AI/stable-point-aware-3d",
|
| 159 |
+
organization="Stability AI"
|
| 160 |
+
)
|
| 161 |
+
register_model_config(
|
| 162 |
+
nick_name="instantmesh",
|
| 163 |
+
model_name="InstantMesh",
|
| 164 |
+
task="Image-to-3D",
|
| 165 |
+
representation="",
|
| 166 |
+
paradigm="",
|
| 167 |
+
page_link="",
|
| 168 |
+
code_link="https://github.com/TencentARC/InstantMesh",
|
| 169 |
+
organization="ARC Lab, Tencent PCG"
|
| 170 |
+
)
|
| 171 |
+
register_model_config(
|
| 172 |
+
nick_name="triposr",
|
| 173 |
+
model_name="TripoSR",
|
| 174 |
+
task="Image-to-3D",
|
| 175 |
+
representation="",
|
| 176 |
+
paradigm="",
|
| 177 |
+
page_link="",
|
| 178 |
+
code_link="https://github.com/VAST-AI-Research/TripoSR",
|
| 179 |
+
organization="Tripo AI, Staility AI"
|
| 180 |
+
)
|
| 181 |
+
register_model_config(
|
| 182 |
+
nick_name="unique3d",
|
| 183 |
+
model_name="Unique3D",
|
| 184 |
+
task="Image-to-3D",
|
| 185 |
+
representation="",
|
| 186 |
+
paradigm="",
|
| 187 |
+
page_link="https://wukailu.github.io/Unique3D/",
|
| 188 |
+
code_link="https://github.com/AiuniAI/Unique3D",
|
| 189 |
+
organization="Tsinghua University"
|
| 190 |
+
)
|
| 191 |
+
register_model_config(
|
| 192 |
+
nick_name="crm",
|
| 193 |
+
model_name="CRM",
|
| 194 |
+
task="Image-to-3D",
|
| 195 |
+
representation="",
|
| 196 |
+
paradigm="",
|
| 197 |
+
page_link="https://ml.cs.tsinghua.edu.cn/~zhengyi/CRM/",
|
| 198 |
+
code_link="https://github.com/thu-ml/CRM",
|
| 199 |
+
organization="Tsinghua University"
|
| 200 |
+
)
|
| 201 |
+
register_model_config(
|
| 202 |
+
nick_name="ln3diff",
|
| 203 |
+
model_name="LN3Diff",
|
| 204 |
+
task="Image-to-3D",
|
| 205 |
+
representation="",
|
| 206 |
+
paradigm="",
|
| 207 |
+
page_link="https://nirvanalan.github.io/projects/ln3diff/",
|
| 208 |
+
code_link="https://github.com/NIRVANALAN/LN3Diff",
|
| 209 |
+
organization="S-Lab, Nanyang Technological University"
|
| 210 |
+
)
|
| 211 |
+
register_model_config(
|
| 212 |
+
nick_name="wonder3d",
|
| 213 |
+
model_name="Wonder3D",
|
| 214 |
+
task="Image-to-3D",
|
| 215 |
+
representation="",
|
| 216 |
+
paradigm="",
|
| 217 |
+
page_link="https://www.xxlong.site/Wonder3D/",
|
| 218 |
+
code_link="https://github.com/xxlong0/Wonder3D",
|
| 219 |
+
organization="The University of Hong Kong"
|
| 220 |
+
)
|
| 221 |
+
register_model_config(
|
| 222 |
+
nick_name="openlrm",
|
| 223 |
+
model_name="OpenLRM",
|
| 224 |
+
task="Image-to-3D",
|
| 225 |
+
representation="",
|
| 226 |
+
paradigm="",
|
| 227 |
+
page_link="",
|
| 228 |
+
code_link="https://github.com/3DTopia/OpenLRM",
|
| 229 |
+
organization="Shanghai AI Lab"
|
| 230 |
+
)
|
| 231 |
+
register_model_config(
|
| 232 |
+
nick_name="sz123",
|
| 233 |
+
model_name="Stable Zero123",
|
| 234 |
+
task="Image-to-3D",
|
| 235 |
+
representation="",
|
| 236 |
+
paradigm="",
|
| 237 |
+
page_link="https://stability.ai/stable-3d",
|
| 238 |
+
code_link="https://huggingface.co/stabilityai/stable-zero123",
|
| 239 |
+
organization="Stability AI"
|
| 240 |
+
)
|
| 241 |
+
register_model_config(
|
| 242 |
+
nick_name="z123",
|
| 243 |
+
model_name="Zero-1-to-3 XL",
|
| 244 |
+
task="Image-to-3D",
|
| 245 |
+
representation="",
|
| 246 |
+
paradigm="",
|
| 247 |
+
page_link="https://zero123.cs.columbia.edu/",
|
| 248 |
+
code_link="https://github.com/cvlab-columbia/zero123",
|
| 249 |
+
organization="Columbia University"
|
| 250 |
+
)
|
| 251 |
+
register_model_config(
|
| 252 |
+
nick_name="magic123",
|
| 253 |
+
model_name="Magic123",
|
| 254 |
+
task="Image-to-3D",
|
| 255 |
+
representation="",
|
| 256 |
+
paradigm="",
|
| 257 |
+
page_link="https://guochengqian.github.io/project/magic123/",
|
| 258 |
+
code_link="https://github.com/guochengqian/Magic123",
|
| 259 |
+
organization="KAUST"
|
| 260 |
+
)
|
| 261 |
+
register_model_config(
|
| 262 |
+
nick_name="lgm",
|
| 263 |
+
model_name="LGM",
|
| 264 |
+
task="Image-to-3D",
|
| 265 |
+
representation="",
|
| 266 |
+
paradigm="",
|
| 267 |
+
page_link="https://me.kiui.moe/lgm/",
|
| 268 |
+
code_link="https://github.com/3DTopia/LGM",
|
| 269 |
+
organization="Peking University"
|
| 270 |
+
)
|
| 271 |
+
register_model_config(
|
| 272 |
+
nick_name="grm-i",
|
| 273 |
+
model_name="GRM",
|
| 274 |
+
task="Image-to-3D",
|
| 275 |
+
representation="",
|
| 276 |
+
paradigm="",
|
| 277 |
+
page_link="https://justimyhxu.github.io/projects/grm/",
|
| 278 |
+
code_link="https://github.com/justimyhxu/grm",
|
| 279 |
+
organization="Stanford Univerity"
|
| 280 |
+
)
|
| 281 |
+
register_model_config(
|
| 282 |
+
nick_name="syncdreamer",
|
| 283 |
+
model_name="SyncDreamer",
|
| 284 |
+
task="Image-to-3D",
|
| 285 |
+
representation="",
|
| 286 |
+
paradigm="",
|
| 287 |
+
page_link="https://liuyuan-pal.github.io/SyncDreamer/",
|
| 288 |
+
code_link="https://github.com/liuyuan-pal/SyncDreamer",
|
| 289 |
+
organization="The University of Hong Kong, Tencent Games"
|
| 290 |
+
)
|
| 291 |
+
register_model_config(
|
| 292 |
+
nick_name="shap-e-i",
|
| 293 |
+
model_name="Shap-E",
|
| 294 |
+
task="Image-to-3D",
|
| 295 |
+
representation="",
|
| 296 |
+
paradigm="",
|
| 297 |
+
page_link="",
|
| 298 |
+
code_link="https://github.com/openai/shap-e",
|
| 299 |
+
organization="OpenAI"
|
| 300 |
+
)
|
| 301 |
+
register_model_config(
|
| 302 |
+
nick_name="point-e-i",
|
| 303 |
+
model_name="Point-E",
|
| 304 |
+
task="Image-to-3D",
|
| 305 |
+
representation="",
|
| 306 |
+
paradigm="",
|
| 307 |
+
page_link="https://openai.com/index/point-e/",
|
| 308 |
+
code_link="https://github.com/openai/point-e",
|
| 309 |
+
organization="OpenAI"
|
| 310 |
+
)
|
| 311 |
+
register_model_config(
|
| 312 |
+
nick_name="escher-net",
|
| 313 |
+
model_name="EscherNet",
|
| 314 |
+
task="Image-to-3D",
|
| 315 |
+
representation="",
|
| 316 |
+
paradigm="",
|
| 317 |
+
page_link="https://kxhit.github.io/EscherNet",
|
| 318 |
+
code_link="https://github.com/kxhit/EscherNet",
|
| 319 |
+
organization="Dyson Robotics Lab, Imperial College London"
|
| 320 |
+
)
|
| 321 |
+
register_model_config(
|
| 322 |
+
nick_name="free3d",
|
| 323 |
+
model_name="Free3D",
|
| 324 |
+
task="Image-to-3D",
|
| 325 |
+
representation="",
|
| 326 |
+
paradigm="",
|
| 327 |
+
page_link="https://chuanxiaz.com/free3d/",
|
| 328 |
+
code_link="https://github.com/lyndonzheng/Free3D",
|
| 329 |
+
organization="Visual Geometry Group, University of Oxford"
|
| 330 |
+
)
|
| 331 |
+
|
| 332 |
+
register_model_config(
|
| 333 |
+
nick_name="triplane-gaussian",
|
| 334 |
+
model_name="TriplaneGaussian",
|
| 335 |
+
task="Image-to-3D",
|
| 336 |
+
representation="",
|
| 337 |
+
paradigm="",
|
| 338 |
+
page_link="https://zouzx.github.io/TriplaneGaussian/",
|
| 339 |
+
code_link="https://github.com/VAST-AI-Research/TriplaneGaussian",
|
| 340 |
+
organization="BNRist, Tsinghua University, VAST"
|
| 341 |
+
)
|
| 342 |
+
|
| 343 |
+
# register_model_config(
|
| 344 |
+
# nick_name="",
|
| 345 |
+
# model_name="",
|
| 346 |
+
# task="",
|
| 347 |
+
# representation="",
|
| 348 |
+
# paradigm="",
|
| 349 |
+
# page_link="",
|
| 350 |
+
# code_link="",
|
| 351 |
+
# organization=""
|
| 352 |
+
# )
|
| 353 |
+
|
serve/tmp.py
ADDED
|
@@ -0,0 +1,379 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
"""
|
| 3 |
+
Live monitor of the website statistics and leaderboard.
|
| 4 |
+
Dependency:
|
| 5 |
+
sudo apt install pkg-config libicu-dev
|
| 6 |
+
pip install pytz gradio gdown plotly polyglot pyicu pycld2 tabulate
|
| 7 |
+
"""
|
| 8 |
+
|
| 9 |
+
import argparse
|
| 10 |
+
import ast
|
| 11 |
+
import pickle
|
| 12 |
+
import os
|
| 13 |
+
import threading
|
| 14 |
+
import time
|
| 15 |
+
|
| 16 |
+
import gradio as gr
|
| 17 |
+
import numpy as np
|
| 18 |
+
import pandas as pd
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
basic_component_values = [None] * 6
|
| 22 |
+
leader_component_values = [None] * 5
|
| 23 |
+
|
| 24 |
+
nam_dict = {
|
| 25 |
+
"dreamfusion": "DreamFusion",
|
| 26 |
+
"mvdream": "MVDream",
|
| 27 |
+
"lucid-dreamer": "LucidDreamer",
|
| 28 |
+
"magic3d": "Magic3D",
|
| 29 |
+
"grm-t": "GRM", "grm-i": "GRM", "grm": "GRM",
|
| 30 |
+
"latent-nerf": "Latent-NeRF",
|
| 31 |
+
"shap-e-t": "Shap-E", "shap-e-i": "Shap-E", "shap-e": "Shap-E",
|
| 32 |
+
"point-e-t": "Point-E", "point-e-i": "Point-E", "point-e": "Point-E",
|
| 33 |
+
"sjc": "SJC",
|
| 34 |
+
"wonder3d": "Wonder3D",
|
| 35 |
+
"openlrm": "OpenLRM",
|
| 36 |
+
"sz123": "Stable Zero123", "stable-zero123": "Stable Zero123",
|
| 37 |
+
"z123": "Zero123-XL", "zero123-xl": "Zero123-XL",
|
| 38 |
+
"magic123": "Magic123",
|
| 39 |
+
"lgm": "LGM",
|
| 40 |
+
"syncdreamer": "SyncDreamer",
|
| 41 |
+
"triplane-gaussian": "TriplaneGaussian",
|
| 42 |
+
"escher-net": "EscherNet",
|
| 43 |
+
"free3d": "Free3D",
|
| 44 |
+
"instant-mesh": "InstantMesh",
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
def replace_model_name(name, rank):
|
| 48 |
+
name = nam_dict[name]
|
| 49 |
+
|
| 50 |
+
if rank==0:
|
| 51 |
+
return "๐ฅ "+name
|
| 52 |
+
elif rank==1:
|
| 53 |
+
return "๐ฅ "+name
|
| 54 |
+
elif rank==2:
|
| 55 |
+
return '๐ฅ '+name
|
| 56 |
+
else:
|
| 57 |
+
return name
|
| 58 |
+
|
| 59 |
+
# def make_leaderboard_md(elo_results):
|
| 60 |
+
# leaderboard_md = f"""
|
| 61 |
+
# # ๐ Chatbot Arena Leaderboard
|
| 62 |
+
# | [Blog](https://lmsys.org/blog/2023-05-03-arena/) | [GitHub](https://github.com/lm-sys/FastChat) | [Paper](https://arxiv.org/abs/2306.05685) | [Dataset](https://github.com/lm-sys/FastChat/blob/main/docs/dataset_release.md) | [Twitter](https://twitter.com/lmsysorg) | [Discord](https://discord.gg/HSWAKCrnFx) |
|
| 63 |
+
|
| 64 |
+
# This leaderboard is based on the following three benchmarks.
|
| 65 |
+
# - [Chatbot Arena](https://lmsys.org/blog/2023-05-03-arena/) - a crowdsourced, randomized battle platform. We use 100K+ user votes to compute Elo ratings.
|
| 66 |
+
# - [MT-Bench](https://arxiv.org/abs/2306.05685) - a set of challenging multi-turn questions. We use GPT-4 to grade the model responses.
|
| 67 |
+
# - [MMLU](https://arxiv.org/abs/2009.03300) (5-shot) - a test to measure a model's multitask accuracy on 57 tasks.
|
| 68 |
+
|
| 69 |
+
# ๐ป Code: The Arena Elo ratings are computed by this [notebook]({notebook_url}). The MT-bench scores (single-answer grading on a scale of 10) are computed by [fastchat.llm_judge](https://github.com/lm-sys/FastChat/tree/main/fastchat/llm_judge). The MMLU scores are mostly computed by [InstructEval](https://github.com/declare-lab/instruct-eval). Higher values are better for all benchmarks. Empty cells mean not available. Last updated: November, 2023.
|
| 70 |
+
# """
|
| 71 |
+
# return leaderboard_md
|
| 72 |
+
|
| 73 |
+
def make_leaderboard_md(elo_results):
|
| 74 |
+
leaderboard_md = f"""
|
| 75 |
+
# ๐ 3DGen-Arena Leaderboard
|
| 76 |
+
"""
|
| 77 |
+
return leaderboard_md
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
def make_leaderboard_md_live(elo_results):
|
| 81 |
+
leaderboard_md = f"""
|
| 82 |
+
# Leaderboard
|
| 83 |
+
Last updated: {elo_results["last_updated_datetime"]}
|
| 84 |
+
{elo_results["leaderboard_table"]}
|
| 85 |
+
"""
|
| 86 |
+
return leaderboard_md
|
| 87 |
+
|
| 88 |
+
|
| 89 |
+
def model_hyperlink(model_name, link):
|
| 90 |
+
return f'<a target="_blank" href="{link}" style="color: var(--link-text-color); text-decoration: underline;text-decoration-style: dotted;">{model_name}</a>'
|
| 91 |
+
|
| 92 |
+
|
| 93 |
+
def load_leaderboard_table_csv(filename, add_hyperlink=True):
|
| 94 |
+
df = pd.read_csv(filename)
|
| 95 |
+
df = df.drop(df[df["Key"].isnull()].index)
|
| 96 |
+
for col in df.columns:
|
| 97 |
+
if "Elo rating" in col:
|
| 98 |
+
# print(col, df[col], type(df[col]), df[col] is not np.NaN)
|
| 99 |
+
df[col] = df[col].apply(lambda x: int(x) if (x != "-" and pd.notna(x)) else np.NaN)
|
| 100 |
+
|
| 101 |
+
if add_hyperlink and col == "Model":
|
| 102 |
+
df[col] = df.apply(lambda row: model_hyperlink(row[col], row["Link"]), axis=1)
|
| 103 |
+
return df
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
def build_basic_stats_tab():
|
| 108 |
+
empty = "Loading ..."
|
| 109 |
+
basic_component_values[:] = [empty, None, empty, empty, empty, empty]
|
| 110 |
+
|
| 111 |
+
md0 = gr.Markdown(empty)
|
| 112 |
+
gr.Markdown("#### Figure 1: Number of model calls and votes")
|
| 113 |
+
plot_1 = gr.Plot(show_label=False)
|
| 114 |
+
with gr.Row():
|
| 115 |
+
with gr.Column():
|
| 116 |
+
md1 = gr.Markdown(empty)
|
| 117 |
+
with gr.Column():
|
| 118 |
+
md2 = gr.Markdown(empty)
|
| 119 |
+
with gr.Row():
|
| 120 |
+
with gr.Column():
|
| 121 |
+
md3 = gr.Markdown(empty)
|
| 122 |
+
with gr.Column():
|
| 123 |
+
md4 = gr.Markdown(empty)
|
| 124 |
+
return [md0, plot_1, md1, md2, md3, md4]
|
| 125 |
+
|
| 126 |
+
|
| 127 |
+
def get_full_table(anony_arena_df, full_arena_df, model_table_df):
|
| 128 |
+
values = []
|
| 129 |
+
for i in range(len(model_table_df)):
|
| 130 |
+
row = []
|
| 131 |
+
model_key = model_table_df.iloc[i]["Key"]
|
| 132 |
+
model_name = model_table_df.iloc[i]["Model"]
|
| 133 |
+
# model display name
|
| 134 |
+
row.append(model_name)
|
| 135 |
+
if model_key in anony_arena_df.index:
|
| 136 |
+
idx = anony_arena_df.index.get_loc(model_key)
|
| 137 |
+
row.append(round(anony_arena_df.iloc[idx]["rating"]))
|
| 138 |
+
else:
|
| 139 |
+
row.append(np.nan)
|
| 140 |
+
if model_key in full_arena_df.index:
|
| 141 |
+
idx = full_arena_df.index.get_loc(model_key)
|
| 142 |
+
row.append(round(full_arena_df.iloc[idx]["rating"]))
|
| 143 |
+
else:
|
| 144 |
+
row.append(np.nan)
|
| 145 |
+
# row.append(model_table_df.iloc[i]["MT-bench (score)"])
|
| 146 |
+
# row.append(model_table_df.iloc[i]["Num Battles"])
|
| 147 |
+
# row.append(model_table_df.iloc[i]["MMLU"])
|
| 148 |
+
# Organization
|
| 149 |
+
row.append(model_table_df.iloc[i]["Organization"])
|
| 150 |
+
# license
|
| 151 |
+
row.append(model_table_df.iloc[i]["License"])
|
| 152 |
+
|
| 153 |
+
values.append(row)
|
| 154 |
+
values.sort(key=lambda x: -x[1] if not np.isnan(x[1]) else 1e9)
|
| 155 |
+
return values
|
| 156 |
+
|
| 157 |
+
|
| 158 |
+
def get_arena_table(arena_dfs, model_table_df):
|
| 159 |
+
# sort by rating
|
| 160 |
+
# arena_df = arena_df.sort_values(by=["rating"], ascending=False)
|
| 161 |
+
values = []
|
| 162 |
+
for i in range(len(model_table_df)):
|
| 163 |
+
row = []
|
| 164 |
+
# model_key = arena_df.index[i]
|
| 165 |
+
# model_name = model_table_df[model_table_df["Key"] == model_key]["Model"].values[
|
| 166 |
+
# 0
|
| 167 |
+
# ]
|
| 168 |
+
model_name = model_table_df.iloc[i]["Key"]
|
| 169 |
+
|
| 170 |
+
# rank
|
| 171 |
+
row.append(i + 1)
|
| 172 |
+
# model display name
|
| 173 |
+
row.append(replace_model_name(model_name, i))
|
| 174 |
+
# elo rating
|
| 175 |
+
num_battles = 0
|
| 176 |
+
for dim in arena_dfs.keys():
|
| 177 |
+
# try:
|
| 178 |
+
# print(arena_dfs[dim].loc[model_name])
|
| 179 |
+
# except:
|
| 180 |
+
# continue
|
| 181 |
+
row.append(round(arena_dfs[dim].loc[model_name]["rating"], 2))
|
| 182 |
+
upper_diff = round(arena_dfs[dim].loc[model_name]["rating_q975"] - arena_dfs[dim].loc[model_name]["rating"])
|
| 183 |
+
lower_diff = round(arena_dfs[dim].loc[model_name]["rating"] - arena_dfs[dim].loc[model_name]["rating_q025"])
|
| 184 |
+
# row.append(f"+{upper_diff}/-{lower_diff}")
|
| 185 |
+
try:
|
| 186 |
+
num_battles += round(arena_dfs[dim].loc[model_name]["num_battles"])
|
| 187 |
+
except:
|
| 188 |
+
num_battles += 0
|
| 189 |
+
# row.append(round(arena_df.iloc[i]["rating"]))
|
| 190 |
+
# upper_diff = round(arena_df.iloc[i]["rating_q975"] - arena_df.iloc[i]["rating"])
|
| 191 |
+
# lower_diff = round(arena_df.iloc[i]["rating"] - arena_df.iloc[i]["rating_q025"])
|
| 192 |
+
# row.append(f"+{upper_diff}/-{lower_diff}")
|
| 193 |
+
row.append(round(model_table_df.iloc[i]["Arena Elo rating"], 2))
|
| 194 |
+
# num battles
|
| 195 |
+
# row.append(round(arena_df.iloc[i]["num_battles"]))
|
| 196 |
+
row.append(num_battles)
|
| 197 |
+
# Organization
|
| 198 |
+
# row.append(
|
| 199 |
+
# model_table_df[model_table_df["Key"] == model_key]["Organization"].values[0]
|
| 200 |
+
# )
|
| 201 |
+
# # license
|
| 202 |
+
# row.append(
|
| 203 |
+
# model_table_df[model_table_df["Key"] == model_key]["License"].values[0]
|
| 204 |
+
# )
|
| 205 |
+
|
| 206 |
+
values.append(row)
|
| 207 |
+
return values
|
| 208 |
+
|
| 209 |
+
def make_arena_leaderboard_md(elo_results):
|
| 210 |
+
total_votes = 0
|
| 211 |
+
for dim in elo_results.keys():
|
| 212 |
+
arena_df = elo_results[dim]["leaderboard_table_df"]
|
| 213 |
+
last_updated = elo_results[dim]["last_updated_datetime"]
|
| 214 |
+
total_votes += sum(arena_df["num_battles"].fillna(0)) // 2
|
| 215 |
+
total_models = len(arena_df)
|
| 216 |
+
|
| 217 |
+
leaderboard_md = f"""
|
| 218 |
+
Total #models: **{total_models}**. \n
|
| 219 |
+
Total #votes: **{int(total_votes)}** (Anonymous Votes only). \n
|
| 220 |
+
Last updated: {last_updated}. \n
|
| 221 |
+
Contribute the votes ๐ณ๏ธ at [3DGen-Arena](https://huggingface.co/spaces/ZhangYuhan/3DGen-Arena)!
|
| 222 |
+
"""
|
| 223 |
+
return leaderboard_md
|
| 224 |
+
|
| 225 |
+
def make_full_leaderboard_md(elo_results):
|
| 226 |
+
total_votes = 0
|
| 227 |
+
for dim in elo_results.keys():
|
| 228 |
+
arena_df = elo_results[dim]["leaderboard_table_df"]
|
| 229 |
+
last_updated = elo_results[dim]["last_updated_datetime"]
|
| 230 |
+
total_votes += sum(arena_df["num_battles"].fillna(0)) // 2
|
| 231 |
+
total_models = len(arena_df)
|
| 232 |
+
|
| 233 |
+
leaderboard_md = f"""
|
| 234 |
+
Total #models: **{total_models}**. \n
|
| 235 |
+
Total #votes: **{int(total_votes)}** (Anonymous + Named Votes). \n
|
| 236 |
+
Last updated: {last_updated}.\n
|
| 237 |
+
Contribute the votes ๐ณ๏ธ at [3DGen-Arena](https://huggingface.co/spaces/ZhangYuhan/3DGen-Arena)!
|
| 238 |
+
"""
|
| 239 |
+
return leaderboard_md
|
| 240 |
+
|
| 241 |
+
def build_empty_leaderboard_tab():
|
| 242 |
+
leaderboard_md = f"""
|
| 243 |
+
# ๐ณ๏ธ Leaderboard
|
| 244 |
+
## Look forward to your votes, and the leaderboard is coming soon!
|
| 245 |
+
"""
|
| 246 |
+
gr.Markdown(leaderboard_md, elem_id="leaderboard_markdown")
|
| 247 |
+
|
| 248 |
+
def build_leaderboard_tab(elo_results_file, leaderboard_table_file, show_plot=False):
|
| 249 |
+
if elo_results_file is None: # Do live update
|
| 250 |
+
md = "Loading ..."
|
| 251 |
+
p1 = p2 = p3 = p4 = None
|
| 252 |
+
else:
|
| 253 |
+
with open(elo_results_file, "rb") as fin:
|
| 254 |
+
elo_results = pickle.load(fin)
|
| 255 |
+
|
| 256 |
+
# print(elo_results)
|
| 257 |
+
# print(elo_results.keys())
|
| 258 |
+
anony_elo_results, full_elo_results = {}, {}
|
| 259 |
+
anony_arena_dfs, full_arena_dfs = {}, {}
|
| 260 |
+
p1, p2, p3, p4 = {}, {}, {}, {}
|
| 261 |
+
for dim in elo_results.keys():
|
| 262 |
+
anony_elo_results[dim] = elo_results[dim]["anony"]
|
| 263 |
+
full_elo_results[dim] = elo_results[dim]["full"]
|
| 264 |
+
anony_arena_dfs[dim] = anony_elo_results[dim]["leaderboard_table_df"]
|
| 265 |
+
full_arena_dfs[dim] = full_elo_results[dim]["leaderboard_table_df"]
|
| 266 |
+
p1[dim] = anony_elo_results[dim]["win_fraction_heatmap"]
|
| 267 |
+
p2[dim] = anony_elo_results[dim]["battle_count_heatmap"]
|
| 268 |
+
p3[dim] = anony_elo_results[dim]["bootstrap_elo_rating"]
|
| 269 |
+
p4[dim] = anony_elo_results[dim]["average_win_rate_bar"]
|
| 270 |
+
print(anony_arena_dfs[dim])
|
| 271 |
+
print(full_arena_dfs[dim])
|
| 272 |
+
|
| 273 |
+
md = make_leaderboard_md(anony_elo_results)
|
| 274 |
+
|
| 275 |
+
md_1 = gr.Markdown(md, elem_id="leaderboard_markdown")
|
| 276 |
+
|
| 277 |
+
if leaderboard_table_file:
|
| 278 |
+
model_table_df = load_leaderboard_table_csv(leaderboard_table_file)
|
| 279 |
+
model_table_df_full = load_leaderboard_table_csv(str(leaderboard_table_file).replace('.csv', '_full.csv'))
|
| 280 |
+
with gr.Tabs() as tabs:
|
| 281 |
+
# arena table
|
| 282 |
+
arena_table_vals = get_arena_table(anony_arena_dfs, model_table_df)
|
| 283 |
+
with gr.Tab("Anony. Arena", id=0):
|
| 284 |
+
md = make_arena_leaderboard_md(anony_elo_results)
|
| 285 |
+
gr.Markdown(md, elem_id="leaderboard_markdown")
|
| 286 |
+
gr.Dataframe(
|
| 287 |
+
# headers=[
|
| 288 |
+
# "Rank",
|
| 289 |
+
# "๐ค Model",
|
| 290 |
+
# "โญ Arena Elo",
|
| 291 |
+
# "๐ 95% CI",
|
| 292 |
+
# "๐ณ๏ธ Votes",
|
| 293 |
+
# "Organization",
|
| 294 |
+
# "License",
|
| 295 |
+
# ],
|
| 296 |
+
headers=["Rank", "๐ค Model"] + [f"๐ {dim} Elo" for dim in anony_arena_dfs.keys()] + ["โญ Avg. Arena Elo Ranking", "๐ฎ Votes"],
|
| 297 |
+
datatype=[
|
| 298 |
+
"str",
|
| 299 |
+
"markdown",
|
| 300 |
+
"number",
|
| 301 |
+
"number",
|
| 302 |
+
"number",
|
| 303 |
+
"number",
|
| 304 |
+
"number",
|
| 305 |
+
"number",
|
| 306 |
+
"number"
|
| 307 |
+
],
|
| 308 |
+
value=arena_table_vals,
|
| 309 |
+
# value=model_table_df,
|
| 310 |
+
elem_id="arena_leaderboard_dataframe",
|
| 311 |
+
height=700,
|
| 312 |
+
column_widths=[50, 200, 100, 100, 100, 100, 100, 100, 100],
|
| 313 |
+
wrap=True,
|
| 314 |
+
)
|
| 315 |
+
with gr.Tab("Full Arena", id=1):
|
| 316 |
+
md = make_full_leaderboard_md(full_elo_results)
|
| 317 |
+
gr.Markdown(md, elem_id="leaderboard_markdown")
|
| 318 |
+
full_table_vals = get_arena_table(full_arena_dfs, model_table_df_full)
|
| 319 |
+
gr.Dataframe(
|
| 320 |
+
headers=["Rank", "๐ค Model"] + [f"๐ {dim} Elo" for dim in anony_arena_dfs.keys()] + ["โญ Avg. Arena Elo Ranking", "๐ฎ Votes"],
|
| 321 |
+
datatype=[
|
| 322 |
+
"str",
|
| 323 |
+
"markdown",
|
| 324 |
+
"number",
|
| 325 |
+
"number",
|
| 326 |
+
"number",
|
| 327 |
+
"number",
|
| 328 |
+
"number",
|
| 329 |
+
"number",
|
| 330 |
+
"number"
|
| 331 |
+
],
|
| 332 |
+
value=full_table_vals,
|
| 333 |
+
elem_id="full_leaderboard_dataframe",
|
| 334 |
+
column_widths=[50, 200, 100, 100, 100, 100, 100, 100, 100],
|
| 335 |
+
height=700,
|
| 336 |
+
wrap=True,
|
| 337 |
+
)
|
| 338 |
+
if not show_plot:
|
| 339 |
+
gr.Markdown(
|
| 340 |
+
""" ## We are still collecting more votes on more models. The ranking will be updated very fruquently. Please stay tuned!
|
| 341 |
+
""",
|
| 342 |
+
elem_id="leaderboard_markdown",
|
| 343 |
+
)
|
| 344 |
+
else:
|
| 345 |
+
pass
|
| 346 |
+
|
| 347 |
+
# leader_component_values[:] = [md, p1, p2, p3, p4]
|
| 348 |
+
|
| 349 |
+
"""
|
| 350 |
+
with gr.Row():
|
| 351 |
+
with gr.Column():
|
| 352 |
+
gr.Markdown(
|
| 353 |
+
"#### Figure 1: Fraction of Model A Wins for All Non-tied A vs. B Battles"
|
| 354 |
+
)
|
| 355 |
+
plot_1 = gr.Plot(p1, show_label=False)
|
| 356 |
+
with gr.Column():
|
| 357 |
+
gr.Markdown(
|
| 358 |
+
"#### Figure 2: Battle Count for Each Combination of Models (without Ties)"
|
| 359 |
+
)
|
| 360 |
+
plot_2 = gr.Plot(p2, show_label=False)
|
| 361 |
+
with gr.Row():
|
| 362 |
+
with gr.Column():
|
| 363 |
+
gr.Markdown(
|
| 364 |
+
"#### Figure 3: Bootstrap of Elo Estimates (1000 Rounds of Random Sampling)"
|
| 365 |
+
)
|
| 366 |
+
plot_3 = gr.Plot(p3, show_label=False)
|
| 367 |
+
with gr.Column():
|
| 368 |
+
gr.Markdown(
|
| 369 |
+
"#### Figure 4: Average Win Rate Against All Other Models (Assuming Uniform Sampling and No Ties)"
|
| 370 |
+
)
|
| 371 |
+
plot_4 = gr.Plot(p4, show_label=False)
|
| 372 |
+
"""
|
| 373 |
+
|
| 374 |
+
from .utils import acknowledgment_md
|
| 375 |
+
|
| 376 |
+
gr.Markdown(acknowledgment_md)
|
| 377 |
+
|
| 378 |
+
# return [md_1, plot_1, plot_2, plot_3, plot_4]
|
| 379 |
+
return [md_1]
|