Spaces:
Running
Running
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() |