Spaces:
Running
Running
File size: 5,068 Bytes
0687bfd 4575207 16df41c a536fa6 f76ab84 4575207 bd369fc 9eab5bd f76ab84 4575207 4411cf7 4575207 f76ab84 bd369fc 4411cf7 bd369fc 4411cf7 bd369fc 4575207 bd369fc 4575207 f76ab84 4575207 16df41c 0687bfd b5b37c1 0687bfd a2c400b 0687bfd a2c400b 34c8d24 a2c400b 34c8d24 0bb735b 9eab5bd b5b37c1 34c8d24 9eab5bd a2c400b 9e2fdc0 66838c3 9eab5bd 1cdf5d6 9eab5bd 9e2fdc0 9eab5bd 25ce5b4 1cdf5d6 436eb46 9eab5bd 1cdf5d6 9e2fdc0 25ce5b4 b5b37c1 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 |
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.
"""
label_img = background_image.convert("RGBA")
draw = ImageDraw.Draw(label_img)
# Load fonts
try:
# Use Inter_24pt-Bold.ttf for the title
title_font = ImageFont.truetype("Inter_24pt-Bold.ttf", size=22) # Bold for title
# Use Inter-Regular.ttf for details and energy
details_font = ImageFont.truetype("Inter_18pt-Regular.ttf", size=18) # Regular for details
energy_font = ImageFont.truetype("Inter_18pt-Medium.ttf", size=20) # Medium for energy
except Exception as e:
st.error(f"Font loading failed: {e}")
return label_img
# Define positions for each text group
title_x, title_y = 28, 128
details_x, details_y = 375, 210
energy_x, energy_y = 350, 390
# 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), str(model_data['provider']), font=title_font, fill="black")
# Group 2: Details (Right-Justified, no prefixes)
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), line, font=details_font, fill="black")
# Group 3: Energy (Bottom-Center, no prefixes)
energy_text = str(model_data['energy']) # Ensure this is a string
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")
return label_img
if __name__ == "__main__":
main()
|