File size: 4,457 Bytes
0687bfd
 
 
 
 
 
ea74654
a536fa6
f76ab84
 
ea74654
bd369fc
 
 
 
 
 
 
 
 
ea74654
bd369fc
 
 
 
 
 
9eab5bd
bde2fbd
4575207
ea74654
 
 
 
 
 
bde2fbd
bd369fc
 
 
ea74654
bd369fc
ea74654
 
bd369fc
 
 
 
 
 
 
 
ea74654
 
 
bd369fc
0b88af7
bd369fc
4575207
 
 
bd369fc
4575207
f76ab84
4575207
 
 
 
 
bde2fbd
0687bfd
ea74654
 
0687bfd
ea74654
0687bfd
ea74654
 
 
0687bfd
ea74654
0687bfd
3b02624
 
 
0bb735b
9eab5bd
ea74654
9eab5bd
ea74654
 
 
ad7a48d
4ee5de3
ad7a48d
9eab5bd
ea74654
9e2fdc0
3e64240
9eab5bd
ea74654
9eab5bd
9e2fdc0
 
 
9eab5bd
 
25ce5b4
1cdf5d6
ea74654
3e64240
9eab5bd
ea74654
da5a01c
25ce5b4
 
3e64240
 
0687bfd
ea74654
 
0687bfd
 
ea74654
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
import streamlit as st
import pandas as pd
from PIL import Image, ImageDraw, ImageFont
import io

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

    # Load 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

    # Check 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

    st.sidebar.write("### Instructions:")
    st.sidebar.write("#### 1. Select a model below")

    model_options = data_df["model"].unique().tolist()
    selected_model = st.sidebar.selectbox(
        "Scored Models",
        model_options,
        help="Start typing to search for a model"
    )
    st.sidebar.write("#### 2. Download the label")

    model_data = data_df[data_df["model"] == selected_model].iloc[0]

    # Select background by score
    try:
        score = int(model_data["score"])
        background_path = f"{score}.png"
        background = Image.open(background_path).convert("RGBA")
    except FileNotFoundError:
        st.sidebar.error(f"Could not find background image '{score}.png'. Using default background.")
        background = Image.open("default_background.png").convert("RGBA")
    except ValueError:
        st.sidebar.error(f"Invalid score '{model_data['score']}'. Score must be an integer.")
        return

    # Keep the final label size at 520×728
    final_size = (520, 728)
    generated_label = create_label_single_pass(background, model_data, final_size)

    st.image(generated_label, caption="Generated Label Preview", width=520)

    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"
    )

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


def create_label_single_pass(background_image, model_data, final_size=(520, 728)):
    """
    Resizes the background to 520×728, then draws text onto it.
    """
    # 1. Resize background to final_size
    bg_resized = background_image.resize(final_size, Image.Resampling.LANCZOS)
    draw = ImageDraw.Draw(bg_resized)

    # 2. Load fonts at sizes appropriate for a 520×728 label
    try:
        title_font = ImageFont.truetype("Inter_24pt-Bold.ttf", size=27)
        details_font = ImageFont.truetype("Inter_18pt-Regular.ttf", size=23)
        energy_font = ImageFont.truetype("Inter_18pt-Medium.ttf", size=24)
    except Exception as e:
        st.error(f"Font loading failed: {e}")
        return bg_resized

    # 3. Place your text. 
    #    You may need to experiment with x/y coordinates or font sizes
    #    to make it look right in 520×728.
    title_x, title_y = 33, 150
    details_x, details_y = 480, 256
    energy_x, energy_y = 480, 472

    # Text 1 (title)
    draw.text((title_x, title_y), str(model_data['model']), font=title_font, fill="black")
    draw.text((title_x, title_y + 38), str(model_data['provider']), font=title_font, fill="black")

    # Text 2 (details)
    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]
        # Right-justify the details text at details_x
        draw.text((details_x - text_width, details_y + i*47), line, font=details_font, fill="black")

    # Text 3 (energy)
    energy_text = str(model_data['energy'])
    bbox = draw.textbbox((0, 0), energy_text, font=energy_font)
    energy_text_width = bbox[2] - bbox[0]
    # Right-align the energy text at energy_x
    draw.text((energy_x - energy_text_width, energy_y), energy_text, font=energy_font, fill="black")

    return bg_resized


if __name__ == "__main__":
    main()