PwCLBExample / app.py
michaelsh's picture
Update app.py
7c3776d verified
raw
history blame
6.53 kB
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()