Spaces:
Sleeping
Sleeping
import gradio as gr | |
import plotly.graph_objects as go | |
import numpy as np | |
import pandas as pd | |
def create_sota_plot(df): | |
""" | |
Create a plot showing model performance evolution over time. | |
Parameters: | |
df: DataFrame with columns ['model_name', 'release_date', 'score'] | |
""" | |
# Sort by release date to ensure chronological order | |
df_sorted = df.sort_values('release_date').copy() | |
# Calculate cumulative best (SOTA) for each point | |
df_sorted['cumulative_best'] = df_sorted['score'].cummax() | |
# Identify which models are SOTA (where score equals cumulative best) | |
df_sorted['is_sota'] = df_sorted['score'] == df_sorted['cumulative_best'] | |
# Get SOTA models for the line | |
sota_df = df_sorted[df_sorted['is_sota']].copy() | |
# Create the plot | |
fig = go.Figure() | |
# Add all models as scatter points (gray for non-SOTA, cyan for SOTA) | |
fig.add_trace(go.Scatter( | |
x=df_sorted['release_date'], | |
y=df_sorted['score'], | |
mode='markers', | |
name='All models', | |
marker=dict( | |
color=['#00CED1' if is_sota else 'lightgray' | |
for is_sota in df_sorted['is_sota']], | |
size=8, | |
opacity=0.7 | |
), | |
text=df_sorted['model_name'], | |
hovertemplate='<b>%{text}</b><br>Date: %{x}<br>Score: %{y:.2f}%<extra></extra>' | |
)) | |
# Add SOTA line (cumulative best) | |
fig.add_trace(go.Scatter( | |
x=df_sorted['release_date'], | |
y=df_sorted['cumulative_best'], | |
mode='lines', | |
name='State-of-the-art (cumulative best)', | |
line=dict(color='#00CED1', width=2, dash='solid'), | |
hovertemplate='SOTA Score: %{y:.2f}%<br>Date: %{x}<extra></extra>' | |
)) | |
# Add labels for SOTA models (models that improved the best score) | |
for _, row in sota_df.iterrows(): | |
fig.add_annotation( | |
x=row['release_date'], | |
y=row['score'], | |
text=row['model_name'], | |
showarrow=True, | |
arrowhead=2, | |
arrowsize=1, | |
arrowwidth=1, | |
arrowcolor='gray', | |
ax=0, | |
ay=-30, | |
font=dict(size=10) | |
) | |
# Update layout | |
fig.update_layout( | |
title='Evolution of Model Performance Over Time', | |
xaxis_title='Release Date', | |
yaxis_title='Score (%)', | |
xaxis=dict( | |
showgrid=True, | |
gridcolor='lightgray' | |
), | |
yaxis=dict( | |
showgrid=True, | |
gridcolor='lightgray' | |
), | |
plot_bgcolor='white', | |
paper_bgcolor='white', | |
height=600, | |
legend=dict( | |
yanchor="top", | |
y=0.99, | |
xanchor="left", | |
x=0.01 | |
), | |
hovermode='closest' | |
) | |
return fig | |
def create_sample_dataframe(): | |
""" | |
Create a sample DataFrame with model performance data. | |
""" | |
# Create sample data | |
data = { | |
'model_name': [ | |
'SIFT + FVs', 'AlexNet', 'VGG-16', 'GoogLeNet', 'ResNet-50', | |
'SPPNet', 'Inception V2', 'Inception V3', 'ResNet-152', 'DenseNet', | |
'MobileNet', 'NASNET-A(6)', 'EfficientNet', 'Vision Transformer', | |
'CoAtNet-7', 'CLIP', 'DALL-E', 'GPT-Vision', 'Model-X', 'Model-Y', | |
# Add some models that don't improve SOTA | |
'SmallNet-1', 'SmallNet-2', 'BasicCNN', 'SimpleDNN', 'QuickNet', | |
'FastNet', 'LiteModel', 'CompactNet', 'MiniVGG', 'TinyResNet' | |
], | |
'release_date': pd.to_datetime([ | |
'2012-01-15', '2012-09-30', '2014-04-10', '2014-09-17', '2015-12-10', | |
'2014-06-18', '2015-02-11', '2015-12-02', '2016-05-11', '2016-08-25', | |
'2017-04-17', '2017-11-04', '2019-05-28', '2020-10-22', | |
'2021-06-09', '2021-01-05', '2021-01-05', '2022-03-14', '2022-07-20', '2022-11-15', | |
# Dates for non-SOTA models | |
'2013-03-10', '2013-07-22', '2014-01-15', '2015-03-20', '2016-02-14', | |
'2017-06-30', '2018-09-12', '2019-02-28', '2020-04-15', '2021-08-30' | |
]), | |
'score': [ | |
53.0, 65.0, 71.5, 74.8, 76.0, | |
74.0, 78.0, 81.0, 77.8, 79.2, | |
70.6, 82.7, 84.3, 85.2, | |
90.88, 86.5, 87.0, 87.79, 87.73, 88.1, | |
# Scores for non-SOTA models (below SOTA at their time) | |
58.0, 62.0, 68.0, 72.0, 73.5, | |
75.0, 78.5, 80.0, 82.0, 84.0 | |
] | |
} | |
return pd.DataFrame(data) | |
# Create Gradio interface | |
with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
gr.Markdown("# State-of-the-Art Models Timeline with Cumulative Best") | |
gr.Markdown(""" | |
This visualization shows the evolution of model performance over time. | |
The line represents the cumulative best (SOTA) score achieved up to each point in time. | |
""") | |
plot = gr.Plot(label="Model Performance Evolution") | |
# Create the main DataFrame inline | |
df_main = create_sample_dataframe() | |
# Display data info | |
with gr.Row(): | |
with gr.Column(): | |
gr.Markdown(f"**Total models in dataset:** {len(df_main)}") | |
gr.Markdown(f"**Date range:** {df_main['release_date'].min().date()} to {df_main['release_date'].max().date()}") | |
gr.Markdown(f"**Best score achieved:** {df_main['score'].max():.2f}%") | |
# Create plot on load | |
demo.load(fn=lambda: create_sota_plot(df_main), outputs=plot) | |
# Add interactive controls | |
with gr.Row(): | |
refresh_btn = gr.Button("Refresh Plot") | |
show_data_btn = gr.Button("Show DataFrame") | |
# DataFrame display (initially hidden) | |
df_display = gr.Dataframe( | |
value=df_main, | |
label="Model Performance Data", | |
visible=False | |
) | |
refresh_btn.click(fn=lambda: create_sota_plot(df_main), outputs=plot) | |
def toggle_dataframe(current_df): | |
return gr.Dataframe(value=current_df, visible=True) | |
show_data_btn.click( | |
fn=lambda: toggle_dataframe(df_main), | |
outputs=df_display | |
) | |
gr.Markdown(""" | |
### About this visualization: | |
- **Cyan line**: Cumulative best (SOTA) score over time - shows the highest score achieved up to each date | |
- **Cyan dots**: Models that achieved a new SOTA when released | |
- **Gray dots**: Other models that didn't beat the existing SOTA | |
- **Hover over points**: See model names, release dates, and scores | |
- The SOTA line only increases or stays flat, never decreases (cumulative maximum) | |
""") | |
demo.launch() |