Spaces:
Running
Running
File size: 4,899 Bytes
0687bfd b5b37c1 16df41c a536fa6 9eab5bd 16df41c 9fb9ff5 0687bfd b5b37c1 0687bfd 9eab5bd 0687bfd b5b37c1 9eab5bd 0687bfd b5b37c1 9eab5bd 0687bfd b5b37c1 9eab5bd 0687bfd b5b37c1 9fb9ff5 35c757c 9fb9ff5 35c757c 9fb9ff5 0687bfd b5b37c1 0687bfd b5b37c1 0687bfd b5b37c1 0687bfd 9eab5bd 0687bfd b5b37c1 0687bfd b5b37c1 0687bfd 9eab5bd a536fa6 436eb46 66838c3 0bb735b 9eab5bd b5b37c1 40d00eb 66838c3 9eab5bd 1cdf5d6 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 |
import streamlit as st
import pandas as pd
from PIL import Image, ImageDraw, ImageFont
import io
def main():
# Sidebar for dropdown, buttons, and instructions
st.sidebar.image("logo.png", use_container_width=True) # Display the logo at the top
st.sidebar.title("Label Generator")
st.sidebar.write("### Instructions:")
st.sidebar.write("1. Select a model from the dropdown.")
st.sidebar.write("2. Download the label.")
st.sidebar.write("3. Share your label in technical reports, announcements, etc.")
st.sidebar.markdown("[AI Energy Score Leaderboard](https://huggingface.co/spaces/AIEnergyScore/Leaderboard)")
# 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
# 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
model_options = data_df["model"].unique().tolist()
selected_model = st.sidebar.selectbox("Select a Model:", model_options)
# 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 Label as PNG",
data=img_buffer,
file_name="AIEnergyScore.png",
mime="image/png"
)
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 the Inter variable font (no LAYOUT_RAQM)
try:
inter_font_path = "Inter-VariableFont_opsz,wght.ttf"
title_font = ImageFont.truetype(inter_font_path, 24) # Bold for title
details_font = ImageFont.truetype(inter_font_path, 20) # Medium for details
energy_font = ImageFont.truetype(inter_font_path, 22) # Medium for energy
# Set bold weight for title font
title_font = title_font.font_variant(weight=700) # Set font weight to bold
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, 124
details_x, details_y = 375, 208
energy_x, energy_y = 350, 388
# Group 1: Title (Left-Justified, no prefixes)
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()
|