|
|
import gradio as gr |
|
|
import pandas as pd |
|
|
import json |
|
|
import os |
|
|
from constants import BANNER, INTRODUCTION_TEXT, CITATION_TEXT, METRICS_TAB_TEXT, DIR_OUTPUT_REQUESTS, LEADERBOARD_CSS |
|
|
from init import is_model_on_hub, upload_file, load_all_info_from_dataset_hub |
|
|
from utils_display import AutoEvalColumn, fields, make_clickable_model, make_clickable_paper, styled_error, styled_message, get_imagenet_columns |
|
|
import numpy as np |
|
|
from datetime import datetime, timezone |
|
|
|
|
|
def get_last_updated_date(file_path): |
|
|
"""Get the last modification date of a file and format it nicely""" |
|
|
try: |
|
|
timestamp = os.path.getmtime(file_path) |
|
|
dt = datetime.fromtimestamp(timestamp) |
|
|
|
|
|
day = dt.day |
|
|
if 4 <= day <= 20 or 24 <= day <= 30: |
|
|
suffix = "th" |
|
|
else: |
|
|
suffix = ["st", "nd", "rd"][day % 10 - 1] if day % 10 in [1, 2, 3] else "th" |
|
|
|
|
|
return dt.strftime(f"%b {day}{suffix} %Y") |
|
|
except OSError: |
|
|
return "Unknown" |
|
|
|
|
|
def load_models_list(json_path): |
|
|
"""Load models list with paper and year information""" |
|
|
with open(json_path, 'r') as f: |
|
|
models_list = json.load(f) |
|
|
|
|
|
|
|
|
models_dict = {} |
|
|
for model in models_list: |
|
|
models_dict[model['path']] = { |
|
|
'paper': model['paper'], |
|
|
'year': model['year'], |
|
|
'license': model['license'] |
|
|
} |
|
|
return models_dict |
|
|
|
|
|
def read_jsonl_to_dataframe(jsonl_path, models_dict): |
|
|
"""Read JSONL file and convert to pandas DataFrame with proper unit conversions and model info""" |
|
|
data = [] |
|
|
with open(jsonl_path, 'r') as f: |
|
|
for line in f: |
|
|
if line.strip(): |
|
|
record = json.loads(line.strip()) |
|
|
|
|
|
|
|
|
if 'parameters' in record: |
|
|
record['parameters_millions'] = record['parameters'] / 1_000_000 |
|
|
|
|
|
if 'flops' in record: |
|
|
record['flops_giga'] = record['flops'] / 1_000_000_000 |
|
|
|
|
|
if 'model_size' in record: |
|
|
record['model_size_mb'] = record['model_size'] / (1024 * 1024) |
|
|
|
|
|
|
|
|
model_name = record.get('model', '') |
|
|
if model_name in models_dict: |
|
|
record['paper'] = models_dict[model_name]['paper'] |
|
|
record['year'] = str(models_dict[model_name]['year']) |
|
|
|
|
|
if 'license' not in record: |
|
|
record['license'] = models_dict[model_name]['license'] |
|
|
else: |
|
|
|
|
|
record['paper'] = "N/A" |
|
|
record['year'] = "N/A" |
|
|
|
|
|
data.append(record) |
|
|
return pd.DataFrame(data) |
|
|
|
|
|
|
|
|
column_names = { |
|
|
"model": "Model", |
|
|
"top1_accuracy": "Top-1 Accuracy β¬οΈ", |
|
|
"top5_accuracy": "Top-5 Accuracy β¬οΈ", |
|
|
"parameters_millions": "Parameters (M)", |
|
|
"flops_giga": "FLOPs (G)", |
|
|
"model_size_mb": "Model Size (MB)", |
|
|
"paper": "Paper", |
|
|
"year": "Year", |
|
|
"license": "License" |
|
|
} |
|
|
|
|
|
eval_queue_repo, requested_models, jsonl_results, _ = load_all_info_from_dataset_hub() |
|
|
|
|
|
if not jsonl_results.exists(): |
|
|
raise Exception(f"JSONL file {jsonl_results} does not exist locally") |
|
|
|
|
|
|
|
|
models_dict = load_models_list("models_list.json") |
|
|
|
|
|
|
|
|
original_df = read_jsonl_to_dataframe(jsonl_results, models_dict) |
|
|
|
|
|
|
|
|
LAST_UPDATED = get_last_updated_date(jsonl_results) |
|
|
|
|
|
|
|
|
def formatter(x): |
|
|
if type(x) is str: |
|
|
x = x |
|
|
elif x == -1 or pd.isna(x): |
|
|
x = "NA" |
|
|
else: |
|
|
x = round(x, 2) |
|
|
return x |
|
|
|
|
|
|
|
|
display_columns = ['model', 'top1_accuracy', 'top5_accuracy', 'parameters_millions', |
|
|
'flops_giga', 'model_size_mb', 'year','paper'] |
|
|
|
|
|
|
|
|
available_columns = [col for col in display_columns if col in original_df.columns] |
|
|
filtered_df = original_df[available_columns].copy() |
|
|
|
|
|
|
|
|
for col in filtered_df.columns: |
|
|
if col == "model": |
|
|
filtered_df[col] = filtered_df[col].apply(lambda x: make_clickable_model(x)) |
|
|
elif col == "paper": |
|
|
filtered_df[col] = filtered_df[col].apply(lambda x: make_clickable_paper(x)) |
|
|
else: |
|
|
filtered_df[col] = filtered_df[col].apply(formatter) |
|
|
|
|
|
|
|
|
filtered_df.rename(columns=column_names, inplace=True) |
|
|
filtered_df.sort_values(by='Top-1 Accuracy β¬οΈ', ascending=False, inplace=True) |
|
|
|
|
|
|
|
|
original_df = filtered_df |
|
|
|
|
|
|
|
|
imagenet_columns = get_imagenet_columns() |
|
|
COLS = [c.name for c in imagenet_columns] |
|
|
TYPES = [c.type for c in imagenet_columns] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def request_model(model_text, chb_imagenet): |
|
|
"""Request evaluation of a model on ImageNet-1k dataset""" |
|
|
|
|
|
|
|
|
dataset_selection = [] |
|
|
if chb_imagenet: |
|
|
dataset_selection.append("ImageNet-1k validation set") |
|
|
|
|
|
if len(dataset_selection) == 0: |
|
|
return styled_error("You need to select at least one dataset") |
|
|
|
|
|
base_model_on_hub, error_msg = is_model_on_hub(model_text) |
|
|
|
|
|
if not base_model_on_hub: |
|
|
return styled_error(f"Base model '{model_text}' {error_msg}") |
|
|
|
|
|
|
|
|
current_time = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") |
|
|
required_datasets = ', '.join(dataset_selection) |
|
|
eval_entry = { |
|
|
"date": current_time, |
|
|
"model": model_text, |
|
|
"datasets_selected": required_datasets, |
|
|
"evaluation_type": "ImageNet-1k_classification" |
|
|
} |
|
|
|
|
|
|
|
|
DIR_OUTPUT_REQUESTS.mkdir(parents=True, exist_ok=True) |
|
|
|
|
|
fn_datasets = '@ '.join(dataset_selection) |
|
|
filename = model_text.replace("/","@") + "@@" + fn_datasets |
|
|
if filename in requested_models: |
|
|
return styled_error(f"A request for this model '{model_text}' and dataset(s) was already made.") |
|
|
try: |
|
|
filename_ext = filename + ".txt" |
|
|
out_filepath = DIR_OUTPUT_REQUESTS / filename_ext |
|
|
|
|
|
|
|
|
with open(out_filepath, "w") as f: |
|
|
f.write(json.dumps(eval_entry)) |
|
|
|
|
|
upload_file(filename, out_filepath) |
|
|
|
|
|
|
|
|
requested_models.append(filename) |
|
|
|
|
|
|
|
|
out_filepath.unlink() |
|
|
|
|
|
return styled_message("π€ Your request has been submitted and will be evaluated soon!") |
|
|
except Exception as e: |
|
|
return styled_error(f"Error submitting request!") |
|
|
|
|
|
def filter_main_table(show_proprietary=True): |
|
|
filtered_df = original_df.copy() |
|
|
|
|
|
|
|
|
if not show_proprietary and "License" in filtered_df.columns: |
|
|
|
|
|
filtered_df = filtered_df[filtered_df["License"] == "Open"] |
|
|
|
|
|
return filtered_df |
|
|
|
|
|
with gr.Blocks(css=LEADERBOARD_CSS) as demo: |
|
|
gr.HTML(BANNER, elem_id="banner") |
|
|
gr.Markdown(INTRODUCTION_TEXT, elem_classes="markdown-text") |
|
|
|
|
|
with gr.Tabs(elem_classes="tab-buttons") as tabs: |
|
|
with gr.TabItem("π
Leaderboard", elem_id="imagenet-benchmark-tab-table", id=0): |
|
|
leaderboard_table = gr.components.Dataframe( |
|
|
value=original_df, |
|
|
datatype=TYPES, |
|
|
elem_id="leaderboard-table", |
|
|
interactive=False, |
|
|
visible=True, |
|
|
) |
|
|
with gr.Row(): |
|
|
show_proprietary_checkbox = gr.Checkbox( |
|
|
label="Show proprietary models", |
|
|
value=True, |
|
|
elem_id="show-proprietary-checkbox" |
|
|
) |
|
|
|
|
|
|
|
|
show_proprietary_checkbox.change( |
|
|
filter_main_table, |
|
|
inputs=[show_proprietary_checkbox], |
|
|
outputs=leaderboard_table |
|
|
) |
|
|
|
|
|
with gr.TabItem("π Metrics", elem_id="imagenet-metrics-tab", id=1): |
|
|
gr.Markdown(METRICS_TAB_TEXT, elem_classes="markdown-text") |
|
|
|
|
|
with gr.TabItem("βοΈβ¨ Request a model here!", elem_id="imagenet-request-tab", id=2): |
|
|
with gr.Column(): |
|
|
gr.Markdown("# βοΈβ¨ Request evaluation for a new model here!", elem_classes="markdown-text") |
|
|
with gr.Column(): |
|
|
gr.Markdown("Select a dataset:", elem_classes="markdown-text") |
|
|
with gr.Column(): |
|
|
model_name_textbox = gr.Textbox(label="Model name (user_name/model_name)") |
|
|
chb_imagenet = gr.Checkbox(label="ImageNet-1k validation set", value=True, interactive=True) |
|
|
with gr.Column(): |
|
|
mdw_submission_result = gr.Markdown() |
|
|
btn_submitt = gr.Button(value="π Request Evaluation") |
|
|
btn_submitt.click(request_model, |
|
|
[model_name_textbox, chb_imagenet], |
|
|
mdw_submission_result) |
|
|
|
|
|
|
|
|
with gr.TabItem("π€ About", elem_id="imagenet-about-tab", id=3): |
|
|
gr.Markdown("## About", elem_classes="markdown-text") |
|
|
gr.Markdown(""" |
|
|
### ImageNet-1k Leaderboard |
|
|
|
|
|
This leaderboard tracks the performance of computer vision models on the ImageNet-1k dataset, |
|
|
which is one of the most widely used benchmarks for image classification. |
|
|
|
|
|
#### Dataset Information |
|
|
- **Training images**: 1.2 million |
|
|
- **Validation images**: 50,000 |
|
|
- **Classes**: 1,000 object categories |
|
|
- **Image resolution**: Variable (typically 224Γ224 or 384Γ384) |
|
|
|
|
|
#### Hardware Configuration |
|
|
- **GPU**: NVIDIA L4 |
|
|
- All results are tested on the same hardware configuration to ensure fair comparison |
|
|
|
|
|
#### Evaluation Metrics |
|
|
- **Top-1 Accuracy**: Percentage of images where the top prediction is correct |
|
|
- **Top-5 Accuracy**: Percentage of images where the correct class is in top 5 predictions |
|
|
- **Parameters**: Number of trainable parameters in millions |
|
|
- **FLOPs**: Floating point operations in billions |
|
|
- **Model Size**: Size of the model file in MB |
|
|
|
|
|
#### Contributing |
|
|
To add your model to the leaderboard, use the "Request a model here!" tab. |
|
|
Your model will be evaluated on the ImageNet-1k validation set using NVIDIA L4 GPU and added to the leaderboard. |
|
|
""", elem_classes="markdown-text") |
|
|
|
|
|
gr.Markdown(f"Last updated on **{LAST_UPDATED}**", elem_classes="markdown-text") |
|
|
|
|
|
with gr.Row(): |
|
|
with gr.Accordion("π Citation", open=False): |
|
|
gr.Textbox( |
|
|
value=CITATION_TEXT, lines=7, |
|
|
label="Copy the BibTeX snippet to cite this source", |
|
|
elem_id="citation-button", |
|
|
show_copy_button=True, |
|
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |