Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
minor update
#153
by MINGYISU - opened
- app.py +27 -11
- scores/LCO-Embedding-Omni-7B.json +2 -2
- scores/e5-omni-3B.json +2 -2
- scores/e5-omni-7B.json +2 -2
- scores/omni-embed-nemotron-3b.json +2 -2
- utils.py +20 -19
- utils_v3.py +18 -11
app.py
CHANGED
|
@@ -23,26 +23,29 @@ with gr.Blocks() as block:
|
|
| 23 |
gr.Markdown(ANNOUNCEMENT)
|
| 24 |
with gr.Tabs(elem_classes="tab-buttons") as tabs:
|
| 25 |
# Table 1, the main leaderboard of overall scores
|
| 26 |
-
with gr.TabItem("π MMEB (V3)", elem_id="tab-overall", id=1):
|
| 27 |
with gr.Row():
|
| 28 |
with gr.Accordion("Citation", open=False):
|
| 29 |
citation_button2 = gr.Textbox(
|
| 30 |
value=v3.CITATION_BUTTON_TEXT_V3,
|
| 31 |
label="Copy the following snippet to cite MMEB-V3",
|
| 32 |
-
elem_id="citation-
|
| 33 |
lines=10,
|
|
|
|
| 34 |
)
|
| 35 |
gr.Textbox(
|
| 36 |
value=v3.CITATION_BUTTON_TEXT_V2,
|
| 37 |
label="Copy the following snippet to cite VLM2Vec/MMEB-V2",
|
| 38 |
-
elem_id="citation-
|
| 39 |
lines=10,
|
|
|
|
| 40 |
)
|
| 41 |
gr.Textbox(
|
| 42 |
value=CITATION_BUTTON_TEXT,
|
| 43 |
label="Copy the following snippet to cite VLM2Vec/MMEB-V1",
|
| 44 |
-
elem_id="citation-
|
| 45 |
-
lines=
|
|
|
|
| 46 |
)
|
| 47 |
gr.Markdown(v3.TABLE_INTRODUCTION)
|
| 48 |
|
|
@@ -73,12 +76,12 @@ with gr.Blocks() as block:
|
|
| 73 |
step=0.1,
|
| 74 |
label="Maximum number of parameters (B)",
|
| 75 |
)
|
| 76 |
-
df2_all = df2[v3.
|
| 77 |
data_component2 = gr.components.Dataframe(
|
| 78 |
value=df2_all,
|
| 79 |
-
headers=v3.
|
| 80 |
type="pandas",
|
| 81 |
-
datatype=v3.
|
| 82 |
interactive=False,
|
| 83 |
visible=True,
|
| 84 |
max_height=2400,
|
|
@@ -111,8 +114,21 @@ with gr.Blocks() as block:
|
|
| 111 |
)
|
| 112 |
refresh_button2.click(fn=v3.refresh_data, outputs=data_component2)
|
| 113 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
# table 2, text scores
|
| 115 |
-
with gr.TabItem("π Text [
|
| 116 |
data_component_t = gr.components.Dataframe(
|
| 117 |
value=v3.rank_models(df2[v3.COLUMN_NAMES_T], 'Text-Overall'),
|
| 118 |
headers=v3.COLUMN_NAMES_T,
|
|
@@ -171,7 +187,7 @@ with gr.Blocks() as block:
|
|
| 171 |
download_v_but_json = gr.DownloadButton("Download Video Ranking (JSON)", value=v3.download_ranking(df2_v, 'video_ranking', format='json'))
|
| 172 |
|
| 173 |
# table 5, audio scores
|
| 174 |
-
with gr.TabItem("π΅ Audio [
|
| 175 |
gr.Markdown(v3.TABLE_INTRODUCTION_A)
|
| 176 |
data_component_a = gr.components.Dataframe(
|
| 177 |
value=v3.rank_models(df2[v3.COLUMN_NAMES_A], 'Audio-Overall'),
|
|
@@ -206,7 +222,7 @@ with gr.Blocks() as block:
|
|
| 206 |
download_vd_but_json = gr.DownloadButton("Download Visual Document Ranking (JSON)", value=v3.download_ranking(df2_d, 'visdoc_ranking', format='json'))
|
| 207 |
|
| 208 |
# table 7, agent scores
|
| 209 |
-
with gr.TabItem("π€ Agents [
|
| 210 |
gr.Markdown(v3.TABLE_INTRODUCTION_AG)
|
| 211 |
data_component_ag = gr.components.Dataframe(
|
| 212 |
value=v3.rank_models(df2[v3.COLUMN_NAMES_AG], 'Agent-Overall'),
|
|
|
|
| 23 |
gr.Markdown(ANNOUNCEMENT)
|
| 24 |
with gr.Tabs(elem_classes="tab-buttons") as tabs:
|
| 25 |
# Table 1, the main leaderboard of overall scores
|
| 26 |
+
with gr.TabItem("π MMEB (V3)[πππ²]", elem_id="tab-overall", id=1):
|
| 27 |
with gr.Row():
|
| 28 |
with gr.Accordion("Citation", open=False):
|
| 29 |
citation_button2 = gr.Textbox(
|
| 30 |
value=v3.CITATION_BUTTON_TEXT_V3,
|
| 31 |
label="Copy the following snippet to cite MMEB-V3",
|
| 32 |
+
elem_id="citation-button3",
|
| 33 |
lines=10,
|
| 34 |
+
show_copy_button=True
|
| 35 |
)
|
| 36 |
gr.Textbox(
|
| 37 |
value=v3.CITATION_BUTTON_TEXT_V2,
|
| 38 |
label="Copy the following snippet to cite VLM2Vec/MMEB-V2",
|
| 39 |
+
elem_id="citation-button2",
|
| 40 |
lines=10,
|
| 41 |
+
show_copy_button=True
|
| 42 |
)
|
| 43 |
gr.Textbox(
|
| 44 |
value=CITATION_BUTTON_TEXT,
|
| 45 |
label="Copy the following snippet to cite VLM2Vec/MMEB-V1",
|
| 46 |
+
elem_id="citation-button1",
|
| 47 |
+
lines=6,
|
| 48 |
+
show_copy_button=True
|
| 49 |
)
|
| 50 |
gr.Markdown(v3.TABLE_INTRODUCTION)
|
| 51 |
|
|
|
|
| 76 |
step=0.1,
|
| 77 |
label="Maximum number of parameters (B)",
|
| 78 |
)
|
| 79 |
+
df2_all = df2[v3.COLUMN_NAMES_V3]
|
| 80 |
data_component2 = gr.components.Dataframe(
|
| 81 |
value=df2_all,
|
| 82 |
+
headers=v3.COLUMN_NAMES_V3,
|
| 83 |
type="pandas",
|
| 84 |
+
datatype=v3.DATA_TITLE_TYPE_V3,
|
| 85 |
interactive=False,
|
| 86 |
visible=True,
|
| 87 |
max_height=2400,
|
|
|
|
| 114 |
)
|
| 115 |
refresh_button2.click(fn=v3.refresh_data, outputs=data_component2)
|
| 116 |
|
| 117 |
+
# v2 overall table
|
| 118 |
+
with gr.TabItem("π MMEB (V2)", elem_id="tab-overall-v2", id=10):
|
| 119 |
+
gr.Markdown("Models are ranked based on **Overall-V2**.")
|
| 120 |
+
overall_df_v2 = gr.components.Dataframe(
|
| 121 |
+
value=v3.rank_models(df2[v3.COLUMN_NAMES_V2], 'Overall-V2'),
|
| 122 |
+
headers=v3.COLUMN_NAMES_V2,
|
| 123 |
+
type="pandas",
|
| 124 |
+
datatype=v3.DATA_TITLE_TYPE_V2,
|
| 125 |
+
interactive=False,
|
| 126 |
+
visible=True,
|
| 127 |
+
max_height=2400,
|
| 128 |
+
)
|
| 129 |
+
|
| 130 |
# table 2, text scores
|
| 131 |
+
with gr.TabItem("π Text [πππ²]", elem_id="tab-text", id=2):
|
| 132 |
data_component_t = gr.components.Dataframe(
|
| 133 |
value=v3.rank_models(df2[v3.COLUMN_NAMES_T], 'Text-Overall'),
|
| 134 |
headers=v3.COLUMN_NAMES_T,
|
|
|
|
| 187 |
download_v_but_json = gr.DownloadButton("Download Video Ranking (JSON)", value=v3.download_ranking(df2_v, 'video_ranking', format='json'))
|
| 188 |
|
| 189 |
# table 5, audio scores
|
| 190 |
+
with gr.TabItem("π΅ Audio [πππ²]", elem_id="tab-audio", id=5):
|
| 191 |
gr.Markdown(v3.TABLE_INTRODUCTION_A)
|
| 192 |
data_component_a = gr.components.Dataframe(
|
| 193 |
value=v3.rank_models(df2[v3.COLUMN_NAMES_A], 'Audio-Overall'),
|
|
|
|
| 222 |
download_vd_but_json = gr.DownloadButton("Download Visual Document Ranking (JSON)", value=v3.download_ranking(df2_d, 'visdoc_ranking', format='json'))
|
| 223 |
|
| 224 |
# table 7, agent scores
|
| 225 |
+
with gr.TabItem("π€ Agents [πππ²]", elem_id="tab-agents", id=7):
|
| 226 |
gr.Markdown(v3.TABLE_INTRODUCTION_AG)
|
| 227 |
data_component_ag = gr.components.Dataframe(
|
| 228 |
value=v3.rank_models(df2[v3.COLUMN_NAMES_AG], 'Agent-Overall'),
|
scores/LCO-Embedding-Omni-7B.json
CHANGED
|
@@ -3,8 +3,8 @@
|
|
| 3 |
"model_name": "LCO-Embedding-Omni-7B",
|
| 4 |
"model_size": 7,
|
| 5 |
"embedding_dimension": 0,
|
| 6 |
-
"url": "",
|
| 7 |
-
"data_source": "Reproduced",
|
| 8 |
"report_generated_date": "2026-07-23T16:25:55.268061"
|
| 9 |
},
|
| 10 |
"metrics": {
|
|
|
|
| 3 |
"model_name": "LCO-Embedding-Omni-7B",
|
| 4 |
"model_size": 7,
|
| 5 |
"embedding_dimension": 0,
|
| 6 |
+
"url": "https://huggingface.co/LCO-Embedding/LCO-Embedding-Omni-7B",
|
| 7 |
+
"data_source": "Reproduced by TIGER-Lab",
|
| 8 |
"report_generated_date": "2026-07-23T16:25:55.268061"
|
| 9 |
},
|
| 10 |
"metrics": {
|
scores/e5-omni-3B.json
CHANGED
|
@@ -3,8 +3,8 @@
|
|
| 3 |
"model_name": "e5-omni-3B",
|
| 4 |
"model_size": 3,
|
| 5 |
"embedding_dimension": 0,
|
| 6 |
-
"url": "",
|
| 7 |
-
"data_source": "Reproduced",
|
| 8 |
"report_generated_date": "2026-07-23T17:40:39.795658"
|
| 9 |
},
|
| 10 |
"metrics": {
|
|
|
|
| 3 |
"model_name": "e5-omni-3B",
|
| 4 |
"model_size": 3,
|
| 5 |
"embedding_dimension": 0,
|
| 6 |
+
"url": "https://huggingface.co/Haon-Chen/e5-omni-3B",
|
| 7 |
+
"data_source": "Reproduced by TIGER-Lab",
|
| 8 |
"report_generated_date": "2026-07-23T17:40:39.795658"
|
| 9 |
},
|
| 10 |
"metrics": {
|
scores/e5-omni-7B.json
CHANGED
|
@@ -3,8 +3,8 @@
|
|
| 3 |
"model_name": "e5-omni-7B",
|
| 4 |
"model_size": 7,
|
| 5 |
"embedding_dimension": 0,
|
| 6 |
-
"url": "",
|
| 7 |
-
"data_source": "Reproduced",
|
| 8 |
"report_generated_date": "2026-07-20T13:57:44.725269"
|
| 9 |
},
|
| 10 |
"metrics": {
|
|
|
|
| 3 |
"model_name": "e5-omni-7B",
|
| 4 |
"model_size": 7,
|
| 5 |
"embedding_dimension": 0,
|
| 6 |
+
"url": "https://huggingface.co/Haon-Chen/e5-omni-7B",
|
| 7 |
+
"data_source": "Reproduced by TIGER-Lab",
|
| 8 |
"report_generated_date": "2026-07-20T13:57:44.725269"
|
| 9 |
},
|
| 10 |
"metrics": {
|
scores/omni-embed-nemotron-3b.json
CHANGED
|
@@ -3,8 +3,8 @@
|
|
| 3 |
"model_name": "omni-embed-nemotron-3b",
|
| 4 |
"model_size": 3,
|
| 5 |
"embedding_dimension": 0,
|
| 6 |
-
"url": "",
|
| 7 |
-
"data_source": "Reproduced",
|
| 8 |
"report_generated_date": "2026-07-20T13:57:43.169818"
|
| 9 |
},
|
| 10 |
"metrics": {
|
|
|
|
| 3 |
"model_name": "omni-embed-nemotron-3b",
|
| 4 |
"model_size": 3,
|
| 5 |
"embedding_dimension": 0,
|
| 6 |
+
"url": "https://huggingface.co/nvidia/omni-embed-nemotron-3b",
|
| 7 |
+
"data_source": "Reproduced by TIGER-Lab",
|
| 8 |
"report_generated_date": "2026-07-20T13:57:43.169818"
|
| 9 |
},
|
| 10 |
"metrics": {
|
utils.py
CHANGED
|
@@ -3,11 +3,16 @@ import os
|
|
| 3 |
import pprint as pp
|
| 4 |
# import requests
|
| 5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
from datasets import DATASETS
|
| 7 |
|
| 8 |
HF_TOKEN = os.environ.get("HF_TOKEN")
|
| 9 |
|
| 10 |
-
BASE_COLS = ["Rank", "Models",
|
| 11 |
TASKS_V1 = ["V1-Overall", "I-CLS", "I-QA", "I-RET", "I-VG"]
|
| 12 |
COLUMN_NAMES = BASE_COLS + TASKS_V1
|
| 13 |
|
|
@@ -24,7 +29,7 @@ We introduce **Massive Multimodal Embedding Benchmark (MMEB)**, a novel comprehe
|
|
| 24 |
|
| 25 |
**MMEB-V2** expands the evaluation scope to include five new tasks:
|
| 26 |
- four video-based tasks: Video Retrieval, Moment Retrieval, Video Classification, and Video Question Answering
|
| 27 |
-
- one
|
| 28 |
|
| 29 |
**MMEB-V3** further extends to a fuller modality setting by adding three major new evaluation categories:
|
| 30 |
- Audio Tasks: audio classification, cross-modal audio retrieval, and audio temporal grounding.
|
|
@@ -83,23 +88,23 @@ CITATION_BUTTON_TEXT = r"""@article{jiang2024vlm2vec,
|
|
| 83 |
SUBMIT_INTRODUCTION = """# Submit on MMEB Leaderboard Introduction \n
|
| 84 |
## Please follow the guidelines in order to submit successfully. \n
|
| 85 |
1. **Step 1οΈβ£:** Please refer to the [**GitHub page**](https://github.com/TIGER-AI-Lab/VLM2Vec) for detailed instructions about evaluating your model. \n
|
| 86 |
-
|
|
|
|
|
|
|
| 87 |
- Adjust your model's configurations in the script before running it
|
| 88 |
-
- Note the "model size" field is digits-only and is in Billions (B)
|
| 89 |
-
- If possible, please also add a contact method in case we want to reach you in the future
|
| 90 |
3. **Step 3οΈβ£:** Finally, create a pull request and upload the generated JSON file to the ***scores*** folder.
|
| 91 |
-
- If directly using web UI:
|
| 92 |
-
- Go to the [scores folder](https://huggingface.co/spaces/TIGER-Lab/MMEB-Leaderboard/upload/main/scores)
|
| 93 |
-
- Select "Upload file" and upload your JSON files.
|
| 94 |
- If by git command line: refer to the [PR documentation](https://huggingface.co/docs/hub/repositories-pull-requests-discussions#pull-requests-advanced-usage).
|
| 95 |
-
- Submit the PR and leave
|
| 96 |
- To delete or modify your submission, submit a new PR with the updated file.\n\n
|
| 97 |
|
| 98 |
## π Bug reporting and feedback
|
| 99 |
-
If you encounter any issues or have
|
| 100 |
If you cannot reach us via above methods, email us at **m7su@uwaterloo.ca**.
|
| 101 |
|
| 102 |
-
## Appendix 1: Example
|
| 103 |
```json
|
| 104 |
{
|
| 105 |
"metadata": {
|
|
@@ -128,10 +133,6 @@ If you cannot reach us via above methods, email us at **m7su@uwaterloo.ca**.
|
|
| 128 |
}
|
| 129 |
}
|
| 130 |
```
|
| 131 |
-
## β οΈ Special Instructions for submitting to MMEB Image (Previously MMEB-V1) Leaderboard
|
| 132 |
-
We understand that some researchers want to exclusively submit to the Image leaderboard, but unfortunately our current leaderboard cannot exclude your model from other modalities' leaderboards.
|
| 133 |
-
To do so, run the 36 image datasets only and simply ignore other datasets.
|
| 134 |
-
The leaderboard will automatically assign a 0 to the missing datasets and your model will be shown on all leaderboards, and might have a lower rank. \n
|
| 135 |
"""
|
| 136 |
|
| 137 |
def create_hyperlinked_names(df):
|
|
@@ -159,7 +160,7 @@ def create_hyperlinked_names(df):
|
|
| 159 |
|
| 160 |
def get_df(file="results.jsonl"):
|
| 161 |
df = pd.read_json(file, orient='records', lines=True)
|
| 162 |
-
df[
|
| 163 |
for task in TASKS_V1:
|
| 164 |
if df[task].isnull().any():
|
| 165 |
df[task] = df[task].apply(lambda score: '-' if pd.isna(score) else score)
|
|
@@ -178,7 +179,7 @@ def search_and_filter_models(df, query, min_size, max_size):
|
|
| 178 |
if query:
|
| 179 |
filtered_df = filtered_df[filtered_df['Models'].str.contains(query, case=False, na=False)]
|
| 180 |
|
| 181 |
-
size_mask = filtered_df[
|
| 182 |
(min_size <= 1000.0 <= max_size) if x == 'unknown'
|
| 183 |
else (min_size <= x <= max_size))
|
| 184 |
|
|
@@ -193,7 +194,7 @@ def search_models(df, query):
|
|
| 193 |
return df
|
| 194 |
|
| 195 |
def get_size_range(df):
|
| 196 |
-
sizes = df[
|
| 197 |
if (sizes == 0.0).all():
|
| 198 |
return 0.0, 1000.0
|
| 199 |
return float(sizes.min()), float(sizes.max())
|
|
@@ -212,7 +213,7 @@ def filter_columns_by_tasks(df, selected_tasks=None):
|
|
| 212 |
if selected_tasks is None or len(selected_tasks) == 0:
|
| 213 |
return df[COLUMN_NAMES]
|
| 214 |
|
| 215 |
-
base_columns = ['Models',
|
| 216 |
selected_columns = base_columns + selected_tasks
|
| 217 |
|
| 218 |
available_columns = [col for col in selected_columns if col in df.columns]
|
|
|
|
| 3 |
import pprint as pp
|
| 4 |
# import requests
|
| 5 |
|
| 6 |
+
# ==========================
|
| 7 |
+
# Define some column names
|
| 8 |
+
MODEL_SIZE_COL_NAME = 'Size(B)'
|
| 9 |
+
# =========================
|
| 10 |
+
|
| 11 |
from datasets import DATASETS
|
| 12 |
|
| 13 |
HF_TOKEN = os.environ.get("HF_TOKEN")
|
| 14 |
|
| 15 |
+
BASE_COLS = ["Rank", "Models", MODEL_SIZE_COL_NAME, "Data Source"]
|
| 16 |
TASKS_V1 = ["V1-Overall", "I-CLS", "I-QA", "I-RET", "I-VG"]
|
| 17 |
COLUMN_NAMES = BASE_COLS + TASKS_V1
|
| 18 |
|
|
|
|
| 29 |
|
| 30 |
**MMEB-V2** expands the evaluation scope to include five new tasks:
|
| 31 |
- four video-based tasks: Video Retrieval, Moment Retrieval, Video Classification, and Video Question Answering
|
| 32 |
+
- one visual documents task: Visual Document Retrieval.
|
| 33 |
|
| 34 |
**MMEB-V3** further extends to a fuller modality setting by adding three major new evaluation categories:
|
| 35 |
- Audio Tasks: audio classification, cross-modal audio retrieval, and audio temporal grounding.
|
|
|
|
| 88 |
SUBMIT_INTRODUCTION = """# Submit on MMEB Leaderboard Introduction \n
|
| 89 |
## Please follow the guidelines in order to submit successfully. \n
|
| 90 |
1. **Step 1οΈβ£:** Please refer to the [**GitHub page**](https://github.com/TIGER-AI-Lab/VLM2Vec) for detailed instructions about evaluating your model. \n
|
| 91 |
+
- If you want to submit to a specific modality leaderboard, such as MMEB Image, only run your model on the corresponding datasets and ignore the remaining.
|
| 92 |
+
- However, your model will still be shown on all leaderboards and might have a lower rank since missing datasets will be assigned a 0. \n
|
| 93 |
+
2. **Step 2οΈβ£:** After running the evaluation pipelines, please use the provided script **(e.g., [report_score_v3.py](https://github.com/TIGER-AI-Lab/VLM2Vec/blob/main/experiments/report_score_v3.py))** to generate the final score sheet.
|
| 94 |
- Adjust your model's configurations in the script before running it
|
| 95 |
+
- Note the "model size" field is digits-only and is in Billions (B) (ex., "8" for 8 billions, "0.5" for 500 millions).
|
| 96 |
+
- If possible, please also add a contact method in case we want to reach you in the future.
|
| 97 |
3. **Step 3οΈβ£:** Finally, create a pull request and upload the generated JSON file to the ***scores*** folder.
|
| 98 |
+
- If directly using web UI: Go to the [scores folder](https://huggingface.co/spaces/TIGER-Lab/MMEB-Leaderboard/upload/main/scores), select "Upload file" and upload your JSON files.
|
|
|
|
|
|
|
| 99 |
- If by git command line: refer to the [PR documentation](https://huggingface.co/docs/hub/repositories-pull-requests-discussions#pull-requests-advanced-usage).
|
| 100 |
+
- Submit the PR and leave comments if any. We will then review and update the leaderboard accordingly.\n
|
| 101 |
- To delete or modify your submission, submit a new PR with the updated file.\n\n
|
| 102 |
|
| 103 |
## π Bug reporting and feedback
|
| 104 |
+
If you encounter any issues or have feedback for improvement regarding the leaderboard, please report them in [Discussion](https://huggingface.co/spaces/TIGER-Lab/MMEB-Leaderboard/discussions).\n
|
| 105 |
If you cannot reach us via above methods, email us at **m7su@uwaterloo.ca**.
|
| 106 |
|
| 107 |
+
## Appendix 1: Example valid score sheet format β¬οΈ: \n
|
| 108 |
```json
|
| 109 |
{
|
| 110 |
"metadata": {
|
|
|
|
| 133 |
}
|
| 134 |
}
|
| 135 |
```
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
"""
|
| 137 |
|
| 138 |
def create_hyperlinked_names(df):
|
|
|
|
| 160 |
|
| 161 |
def get_df(file="results.jsonl"):
|
| 162 |
df = pd.read_json(file, orient='records', lines=True)
|
| 163 |
+
df[MODEL_SIZE_COL_NAME] = df['Model Size(B)'].apply(process_model_size)
|
| 164 |
for task in TASKS_V1:
|
| 165 |
if df[task].isnull().any():
|
| 166 |
df[task] = df[task].apply(lambda score: '-' if pd.isna(score) else score)
|
|
|
|
| 179 |
if query:
|
| 180 |
filtered_df = filtered_df[filtered_df['Models'].str.contains(query, case=False, na=False)]
|
| 181 |
|
| 182 |
+
size_mask = filtered_df[MODEL_SIZE_COL_NAME].apply(lambda x:
|
| 183 |
(min_size <= 1000.0 <= max_size) if x == 'unknown'
|
| 184 |
else (min_size <= x <= max_size))
|
| 185 |
|
|
|
|
| 194 |
return df
|
| 195 |
|
| 196 |
def get_size_range(df):
|
| 197 |
+
sizes = df[MODEL_SIZE_COL_NAME].apply(lambda x: 0.0 if x == 'unknown' else x)
|
| 198 |
if (sizes == 0.0).all():
|
| 199 |
return 0.0, 1000.0
|
| 200 |
return float(sizes.min()), float(sizes.max())
|
|
|
|
| 213 |
if selected_tasks is None or len(selected_tasks) == 0:
|
| 214 |
return df[COLUMN_NAMES]
|
| 215 |
|
| 216 |
+
base_columns = ['Models', MODEL_SIZE_COL_NAME, 'Data Source', 'Overall']
|
| 217 |
selected_columns = base_columns + selected_tasks
|
| 218 |
|
| 219 |
available_columns = [col for col in selected_columns if col in df.columns]
|
utils_v3.py
CHANGED
|
@@ -2,16 +2,21 @@ import json
|
|
| 2 |
import os
|
| 3 |
import pandas as pd
|
| 4 |
from datetime import datetime
|
| 5 |
-
from utils import create_hyperlinked_names, process_model_size
|
| 6 |
from datasets import *
|
| 7 |
|
| 8 |
-
BASE_COLS = ['Rank', 'Models',
|
| 9 |
BASE_DATA_TITLE_TYPE = ['str', 'markdown', 'str', 'str']
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
['number'] * len(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
|
| 16 |
SUB_TASKS_T = ["FollowIR", "R2MED", "InfoSearch", "BRIGHT", "LongEmbed", "MultiConIR", "NanoBEIR"]
|
| 17 |
TASKS_T = ['Text-Overall'] + SUB_TASKS_T + ALL_DATASETS_SPLITS['text']
|
|
@@ -50,7 +55,7 @@ DATA_TITLE_TYPE_AG = BASE_DATA_TITLE_TYPE + \
|
|
| 50 |
['number'] * len(TASKS_AG)
|
| 51 |
|
| 52 |
TABLE_INTRODUCTION = """**MMEB**: Massive MultiModal Embedding Benchmark \n
|
| 53 |
-
Models are ranked based on **Overall**(V3)."""
|
| 54 |
TABLE_INTRODUCTION_I = """**I-CLS**: Image Classification, **I-QA**: (Image) Visual Question Answering, **I-RET**: Image Retrieval, **I-VG**: (Image) Visual Grounding \n
|
| 55 |
Models are ranked based on **Image-Overall**\n
|
| 56 |
**Models from the old V1 leaderboard are missing detailed scores of each dataset.
|
|
@@ -138,6 +143,8 @@ def calculate_score(raw_scores=None):
|
|
| 138 |
avg_scores['Overall'] = get_avg(sum(all_scores.values()), len(ALL_DATASETS))
|
| 139 |
v2_scores = {k:v for k,v in all_scores.items() if k in ALL_DATASETS_SPLITS['image'] or k in ALL_DATASETS_SPLITS['video'] or k in ALL_DATASETS_SPLITS['visdoc']}
|
| 140 |
avg_scores['Overall-V2'] = get_avg(sum(v2_scores.values()), len(v2_scores))
|
|
|
|
|
|
|
| 141 |
|
| 142 |
# Calculate scores for each modality
|
| 143 |
for modality in MODALITIES:
|
|
@@ -160,9 +167,9 @@ def generate_model_row(data):
|
|
| 160 |
metadata = data['metadata']
|
| 161 |
row = {
|
| 162 |
'Models': metadata.get('model_name', None),
|
| 163 |
-
|
| 164 |
'URL': metadata.get('url', None),
|
| 165 |
-
'
|
| 166 |
'Date': metadata.get('report_generated_date', None)
|
| 167 |
}
|
| 168 |
scores = calculate_score(data['metrics'])
|
|
@@ -192,7 +199,7 @@ def get_df(rank_column='Overall'):
|
|
| 192 |
all_data = load_data()
|
| 193 |
rows = [generate_model_row(data) for data in all_data]
|
| 194 |
df = pd.DataFrame(rows)
|
| 195 |
-
df[
|
| 196 |
df['Date'] = df['Date'].apply(print_time)
|
| 197 |
df = create_hyperlinked_names(df)
|
| 198 |
df = rank_models(df, column=rank_column)
|
|
@@ -208,7 +215,7 @@ def search_and_filter_models(df, query, min_size, max_size):
|
|
| 208 |
if query:
|
| 209 |
filtered_df = filtered_df[filtered_df['Models'].str.contains(query, case=False, na=False)]
|
| 210 |
|
| 211 |
-
size_mask = filtered_df[
|
| 212 |
(min_size <= 1000.0 <= max_size) if x == 'unknown'
|
| 213 |
else (min_size <= x <= max_size))
|
| 214 |
|
|
|
|
| 2 |
import os
|
| 3 |
import pandas as pd
|
| 4 |
from datetime import datetime
|
| 5 |
+
from utils import create_hyperlinked_names, process_model_size, MODEL_SIZE_COL_NAME
|
| 6 |
from datasets import *
|
| 7 |
|
| 8 |
+
BASE_COLS = ['Rank', 'Models', MODEL_SIZE_COL_NAME, 'Date']
|
| 9 |
BASE_DATA_TITLE_TYPE = ['str', 'markdown', 'str', 'str']
|
| 10 |
|
| 11 |
+
OVERALL_COLS_V2 = ["Overall-V2", 'Image-Overall', 'Video-Overall', 'Visdoc-Overall']
|
| 12 |
+
COLUMN_NAMES_V2 = BASE_COLS + OVERALL_COLS_V2
|
| 13 |
+
DATA_TITLE_TYPE_V2 = BASE_DATA_TITLE_TYPE + \
|
| 14 |
+
['number'] * len(OVERALL_COLS_V2)
|
| 15 |
+
|
| 16 |
+
OVERALL_COLS_V3 = ["Overall", "Overall-V3π", "Text-Overall", "Audio-Overall", "Agent-Overall"]
|
| 17 |
+
COLUMN_NAMES_V3 = BASE_COLS + OVERALL_COLS_V3
|
| 18 |
+
DATA_TITLE_TYPE_V3 = BASE_DATA_TITLE_TYPE + \
|
| 19 |
+
['number'] * len(OVERALL_COLS_V3)
|
| 20 |
|
| 21 |
SUB_TASKS_T = ["FollowIR", "R2MED", "InfoSearch", "BRIGHT", "LongEmbed", "MultiConIR", "NanoBEIR"]
|
| 22 |
TASKS_T = ['Text-Overall'] + SUB_TASKS_T + ALL_DATASETS_SPLITS['text']
|
|
|
|
| 55 |
['number'] * len(TASKS_AG)
|
| 56 |
|
| 57 |
TABLE_INTRODUCTION = """**MMEB**: Massive MultiModal Embedding Benchmark \n
|
| 58 |
+
Models are ranked based on **Overall**(V3-ALL). **Overall-V3π**: Newly added datasets in V3."""
|
| 59 |
TABLE_INTRODUCTION_I = """**I-CLS**: Image Classification, **I-QA**: (Image) Visual Question Answering, **I-RET**: Image Retrieval, **I-VG**: (Image) Visual Grounding \n
|
| 60 |
Models are ranked based on **Image-Overall**\n
|
| 61 |
**Models from the old V1 leaderboard are missing detailed scores of each dataset.
|
|
|
|
| 143 |
avg_scores['Overall'] = get_avg(sum(all_scores.values()), len(ALL_DATASETS))
|
| 144 |
v2_scores = {k:v for k,v in all_scores.items() if k in ALL_DATASETS_SPLITS['image'] or k in ALL_DATASETS_SPLITS['video'] or k in ALL_DATASETS_SPLITS['visdoc']}
|
| 145 |
avg_scores['Overall-V2'] = get_avg(sum(v2_scores.values()), len(v2_scores))
|
| 146 |
+
v3_newonly_scores = {k:v for k,v in all_scores.items() if k in ALL_DATASETS_SPLITS['text'] or k in ALL_DATASETS_SPLITS['audio'] or k in ALL_DATASETS_SPLITS['agent']}
|
| 147 |
+
avg_scores['Overall-V3π'] = get_avg(sum(v3_newonly_scores.values()), len(v3_newonly_scores))
|
| 148 |
|
| 149 |
# Calculate scores for each modality
|
| 150 |
for modality in MODALITIES:
|
|
|
|
| 167 |
metadata = data['metadata']
|
| 168 |
row = {
|
| 169 |
'Models': metadata.get('model_name', None),
|
| 170 |
+
MODEL_SIZE_COL_NAME: metadata.get('model_size', None),
|
| 171 |
'URL': metadata.get('url', None),
|
| 172 |
+
'Submitted by': metadata.get('data_source', 'Self-Reported'),
|
| 173 |
'Date': metadata.get('report_generated_date', None)
|
| 174 |
}
|
| 175 |
scores = calculate_score(data['metrics'])
|
|
|
|
| 199 |
all_data = load_data()
|
| 200 |
rows = [generate_model_row(data) for data in all_data]
|
| 201 |
df = pd.DataFrame(rows)
|
| 202 |
+
df[MODEL_SIZE_COL_NAME] = df[MODEL_SIZE_COL_NAME].apply(process_model_size)
|
| 203 |
df['Date'] = df['Date'].apply(print_time)
|
| 204 |
df = create_hyperlinked_names(df)
|
| 205 |
df = rank_models(df, column=rank_column)
|
|
|
|
| 215 |
if query:
|
| 216 |
filtered_df = filtered_df[filtered_df['Models'].str.contains(query, case=False, na=False)]
|
| 217 |
|
| 218 |
+
size_mask = filtered_df[MODEL_SIZE_COL_NAME].apply(lambda x:
|
| 219 |
(min_size <= 1000.0 <= max_size) if x == 'unknown'
|
| 220 |
else (min_size <= x <= max_size))
|
| 221 |
|