Shanshan Wang
color change
f59416c
import pandas as pd
import plotly.express as px
import gradio as gr
data_path = '0926-OCRBench-opensource.csv'
data_mmlm_path = 'filtered_opencompass.csv'
data = pd.read_csv(data_path).fillna(0)
######## OCRBench ########
# set the data types for the columns
dtype_dict = {
"Model": str,
"Param (B)": float,
"OCRBench":int,
"Text Recognition":int,
"Scene Text-centric VQA":int,
"Document Oriented VQA":int,
"KIE":int,
"Handwritten Math Expression Recognition":int}
# preprocess the dataframe
data_valid = data[:25].copy()
data_valid = data_valid.astype(dtype_dict)
data_valid.drop(columns=['Unnamed: 11'], inplace=True)
# Add a new column that assigns categories to Model A, Model B, and Model C, and 'Other' to the rest
def categorize_model(model):
if model in ["H2OVL-Mississippi-2B", "H2OVL-Mississippi-0.8B"]:
return "H2OVLs"
elif model.startswith("doctr"): # Third group for ocr models
return "traditional ocr models"
else:
return "Other"
# Define a color map with yellow for "H2OVLs"
color_map = {"H2OVLs": "#FEC925", "Other": "#9F9F9D", "traditional ocr models": "#54585A"}
# Apply the categorization to create a new column
data_valid["Category"] = data_valid["Model"].apply(categorize_model)
# ploting
def plot_metric(selected_metric):
filtered_data = data_valid[data_valid[selected_metric] !=0 ]
# Create the scatter plot with different colors for "Special" and "Other"
fig = px.scatter(
filtered_data,
x="Param (B)",
y=selected_metric,
text="Model",
color="Category", # Different color for Special and Other categories
title=f"{selected_metric} vs Model Size",
color_discrete_map=color_map
)
fig.update_traces(marker=dict(size=10), mode='markers+text', textposition="middle right", textfont=dict(size=10))
# Extend the x-axis range
max_x_value = filtered_data["Param (B)"].max()
fig.update_layout(
xaxis_range=[0, max_x_value + 5], # Extend the x-axis range to give more space for text
xaxis_title="Model Size (B)",
yaxis_title=selected_metric,
showlegend=False,
height=800,
margin=dict(t=50, l=50, r=100, b=50), # Increase right margin for more space
)
# Use texttemplate to ensure full model name is displayed
fig.update_traces(texttemplate='%{text}')
return fig
####### OpenCompass ########
data_mmlm = pd.read_csv(data_mmlm_path).fillna(0)
data_mmlm.rename(columns={"Avg. Score (8 single image benchmarks)": "Average Score"}, inplace=True)
metrics_column = list(data_mmlm.columns)[6:]
def plot_metric_mmlm_grouped(category):
# Filter the data based on the selected category
filtered_data = data_mmlm[data_mmlm["Category"] == category].copy()
# Melt the dataframe to have a "Metric" column and a "Score" column
melted_data = pd.melt(
filtered_data,
id_vars=["Models"], # Keep the Model column as identifier
value_vars=metrics_column, # Melt all the metric columns
var_name="Metrics", # Name for the new column containing metrics
value_name="Score" # Name for the new column containing scores
)
# Generate a grouped bar chart
fig = px.bar(
melted_data,
x="Metrics",
y="Score",
color="Models", # Differentiate metrics by color
barmode="group", # Grouped bars
title=f"Scores for All Metrics in {category} Category"
)
fig.update_layout(
xaxis_title="Metrics",
yaxis_title="Score",
height=600,
margin=dict(t=50, l=50, r=100, b=50),
)
return fig
# Gradio Blocks Interface with Tabs
def create_interface():
with gr.Blocks() as interface:
with gr.Tabs():
with gr.Tab("OCRBench"):
with gr.Row():
with gr.Column(scale=4): # Column for the plot (takes 4 parts of the total space)
plot = gr.Plot(value=plot_metric("Text Recognition"), label="OCR Benchmark Metrics") # default plot component initially
with gr.Column(scale=1): # Column for the dropdown (takes 1 part of the total space)
metrics = list(data_valid.columns[5:-1]) # List of metric columns (excluding 'Model' and 'Parameter Size')
dropdown = gr.Dropdown(metrics, label="Select Metric", value="Text Recognition")
# Update the plot when dropdown selection changes
dropdown.change(fn=plot_metric, inputs=dropdown, outputs=plot)
with gr.Tab("8 Multi-modal Benchmarks"):
with gr.Row():
# Dropdown for selecting the category
categories = data_mmlm["Category"].unique().tolist()
category_dropdown = gr.Dropdown(categories, label="Select Category", value=categories[0])
with gr.Row():
mm_plot = gr.Plot(value=plot_metric_mmlm_grouped(categories[0]), label="Grouped Metrics for Models")
# Update the plot based on category dropdown changes
category_dropdown.change(fn=plot_metric_mmlm_grouped, inputs=category_dropdown, outputs=mm_plot)
return interface
# Launch the interface
if __name__ == "__main__":
create_interface().launch()