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-button",
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-button",
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-button",
45
- lines=10,
 
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.COLUMN_NAMES]
77
  data_component2 = gr.components.Dataframe(
78
  value=df2_all,
79
- headers=v3.COLUMN_NAMES,
80
  type="pandas",
81
- datatype=v3.DATA_TITLE_TYPE,
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 [NEW]", elem_id="tab-text", id=2):
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 [NEW]", elem_id="tab-audio", id=5):
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 [NEW]", elem_id="tab-agents", id=7):
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", "Model Size(B)", "Data Source"]
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 task focused on visual documents: Visual Document Retrieval.
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
- 2. **Step 2️⃣:** After running the evaluation pipelines, please use the provided script **(e.g., [report_score_v2.py](https://github.com/TIGER-AI-Lab/VLM2Vec/blob/main/experiments/report_score_v2.py))** to generate the final score sheet. (Use [report_score_v3.py](https://github.com/TIGER-AI-Lab/VLM2Vec/blob/main/experiments/report_score_v3.py) for v3 submission).
 
 
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), so please convert it if yours is in different units/formats (e.x., "8" for 8 billion, "0.5" for 500 million).
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 any comments if any. We will then review and update the leaderboard accordingly.\n
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 improvement feedback regarding the leaderboard, please report them in Discussion.\n
100
  If you cannot reach us via above methods, email us at **m7su@uwaterloo.ca**.
101
 
102
- ## Appendix 1: Example: valid score sheet format ⬇️: \n
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['Model Size(B)'] = df['Model Size(B)'].apply(process_model_size)
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['Model Size(B)'].apply(lambda x:
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['Model Size(B)'].apply(lambda x: 0.0 if x == 'unknown' else x)
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', 'Model Size(B)', 'Data Source', 'Overall']
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', 'Model Size(B)', 'Date']
9
  BASE_DATA_TITLE_TYPE = ['str', 'markdown', 'str', 'str']
10
 
11
- OVERALL_COLS = ["Overall", "Overall-V2", "Text-Overall", 'Image-Overall', 'Video-Overall', 'Audio-Overall', 'Visdoc-Overall', "Agent-Overall"]
12
- COLUMN_NAMES = BASE_COLS + OVERALL_COLS
13
- DATA_TITLE_TYPE = BASE_DATA_TITLE_TYPE + \
14
- ['number'] * len(OVERALL_COLS)
 
 
 
 
 
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
- 'Model Size(B)': metadata.get('model_size', None),
164
  'URL': metadata.get('url', None),
165
- 'Data Source': metadata.get('data_source', 'Self-Reported'),
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['Model Size(B)'] = df['Model Size(B)'].apply(process_model_size)
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['Model Size(B)'].apply(lambda x:
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