File size: 5,531 Bytes
0687bfd
 
 
 
 
 
4575207
16df41c
a536fa6
f76ab84
 
4575207
bd369fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9eab5bd
bde2fbd
4575207
 
4411cf7
4575207
 
 
bde2fbd
bd369fc
4411cf7
bd369fc
 
4411cf7
bd369fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4575207
 
 
bd369fc
4575207
f76ab84
4575207
 
 
 
 
 
bde2fbd
0687bfd
 
 
b5b37c1
89b17b0
0687bfd
89b17b0
 
 
 
0687bfd
89b17b0
da5a01c
 
 
 
0687bfd
da5a01c
 
 
0bb735b
9eab5bd
da5a01c
9eab5bd
da5a01c
 
 
 
9eab5bd
a2c400b
9e2fdc0
da5a01c
9eab5bd
da5a01c
9eab5bd
9e2fdc0
 
 
9eab5bd
 
25ce5b4
1cdf5d6
da5a01c
9eab5bd
da5a01c
 
25ce5b4
 
b5b37c1
0687bfd
89b17b0
 
da5a01c
0687bfd
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import streamlit as st
import pandas as pd
from PIL import Image, ImageDraw, ImageFont
import io

def main():
    # Sidebar logo and title
    st.sidebar.image("logo.png", use_container_width=True)  # Display the logo at the top
    st.sidebar.title("Label Generator")
    st.sidebar.markdown("For [AI Energy Score Leaderboard](https://huggingface.co/spaces/AIEnergyScore/Leaderboard)")


    # Initialize data_df
    data_df = None

    # Read Data from CSV
    try:
        data_df = pd.read_csv("data.csv")
    except FileNotFoundError:
        st.sidebar.error("Could not find 'data.csv'! Please make sure it's present.")
        return
    except Exception as e:
        st.sidebar.error(f"Error reading 'data.csv': {e}")
        return

    # Ensure the CSV has required columns
    required_columns = ["model", "provider", "date", "task", "hardware", "energy", "score"]
    for col in required_columns:
        if col not in data_df.columns:
            st.sidebar.error(f"The CSV file must contain a column named '{col}'.")
            return

    # Dropdown for selecting a model
    st.sidebar.write("### Instructions:")
    st.sidebar.write("#### 1. Select a model below")
    model_options = data_df["model"].unique().tolist()  # Get model options
    selected_model = st.sidebar.selectbox(
        "Scored Models", model_options, help="Start typing to search for a model"
    )  # Searchable dropdown

    # Add step 2 instructions and move the Download button
    st.sidebar.write("#### 2. Download the label")

    # Filter the data for the selected model
    model_data = data_df[data_df["model"] == selected_model].iloc[0]

    # Dynamically select the background image based on the score
    try:
        score = int(model_data["score"])  # Convert to int
        background_path = f"{score}.png"  # E.g., "1.png", "2.png"
        background = Image.open(background_path).convert("RGBA")

        # Proportional scaling to fit within the target size
        target_size = (800, 600)  # Maximum width and height
        background.thumbnail(target_size, Image.Resampling.LANCZOS)

    except FileNotFoundError:
        st.sidebar.error(f"Could not find background image '{score}.png'. Using default background.")
        background = Image.open("default_background.png").convert("RGBA")
        background.thumbnail(target_size, Image.Resampling.LANCZOS)  # Resize default image proportionally
    except ValueError:
        st.sidebar.error(f"Invalid score '{model_data['score']}'. Score must be an integer.")
        return

    # Generate the label with text
    generated_label = create_label(background, model_data)

    # Display the label
    st.image(generated_label, caption="Generated Label Preview")

    # Download button for the label
    img_buffer = io.BytesIO()
    generated_label.save(img_buffer, format="PNG")
    img_buffer.seek(0)

    st.sidebar.download_button(
        label="Download",
        data=img_buffer,
        file_name="AIEnergyScore.png",
        mime="image/png"
    )

    # Step 3 instructions
    st.sidebar.write("#### 3. Share your label in technical reports, announcements, etc.")

def create_label(background_image, model_data):
    """
    Create the label image by adding text from model_data to the background image.
    Render at high resolution and scale down for sharper output.
    """
    # Scale factor for high resolution rendering
    scale_factor = 2
    original_size = background_image.size
    high_res_size = (original_size[0] * scale_factor, original_size[1] * scale_factor)

    # Resize background proportionally for high resolution
    high_res_image = background_image.resize(high_res_size, Image.Resampling.LANCZOS)
    draw = ImageDraw.Draw(high_res_image)

    # Load fonts with scaled sizes
    try:
        title_font = ImageFont.truetype("Inter_24pt-Bold.ttf", size=22 * scale_factor)
        details_font = ImageFont.truetype("Inter_18pt-Regular.ttf", size=18 * scale_factor)
        energy_font = ImageFont.truetype("Inter_18pt-Medium.ttf", size=20 * scale_factor)
    except Exception as e:
        st.error(f"Font loading failed: {e}")
        return high_res_image

    # Define scaled positions for text
    title_x, title_y = 28 * scale_factor, 128 * scale_factor
    details_x, details_y = 375 * scale_factor, 210 * scale_factor
    energy_x, energy_y = 350 * scale_factor, 390 * scale_factor

    # Group 1: Title (Bold)
    draw.text((title_x, title_y), str(model_data['model']), font=title_font, fill="black")
    draw.text((title_x, title_y + 30 * scale_factor), str(model_data['provider']), font=title_font, fill="black")

    # Group 2: Details (Right-Justified)
    details_lines = [
        str(model_data['date']),
        str(model_data['task']),
        str(model_data['hardware'])
    ]
    for i, line in enumerate(details_lines):
        bbox = draw.textbbox((0, 0), line, font=details_font)
        text_width = bbox[2] - bbox[0]
        draw.text((details_x - text_width, details_y + i * 40 * scale_factor), line, font=details_font, fill="black")

    # Group 3: Energy (Bottom-Center)
    energy_text = str(model_data['energy'])
    bbox = draw.textbbox((0, 0), energy_text, font=energy_font)
    energy_text_width = bbox[2] - bbox[0]
    draw.text((energy_x - energy_text_width // 2, energy_y), energy_text, font=energy_font, fill="black")

    # Downscale to original size
    final_image = high_res_image.resize(original_size, Image.Resampling.LANCZOS)
    return final_image

if __name__ == "__main__":
    main()