bgamazay commited on
Commit
b5b37c1
·
verified ·
1 Parent(s): 8a89b9d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +23 -22
app.py CHANGED
@@ -4,7 +4,7 @@ from PIL import Image, ImageDraw, ImageFont
4
  import io
5
 
6
  def main():
7
- # 1. Sidebar for Dropdown, Buttons, and Instructions
8
  st.sidebar.title("AI Energy Score Label Generator")
9
  st.sidebar.write("### Instructions:")
10
  st.sidebar.write("1. Select a model from the dropdown.")
@@ -12,30 +12,30 @@ def main():
12
  st.sidebar.write("3. Download the label as a PNG.")
13
  st.sidebar.markdown("[Learn more about AI Energy Scores](https://example.com)")
14
 
15
- # 2. Read Data from CSV
16
  try:
17
  data_df = pd.read_csv("data.csv")
18
  except FileNotFoundError:
19
  st.sidebar.error("Could not find 'data.csv'! Please make sure it's present.")
20
  return
21
 
22
- # 3. Ensure the CSV has required columns
23
  required_columns = ["model", "provider", "date", "task", "hardware", "energy", "score"]
24
  for col in required_columns:
25
  if col not in data_df.columns:
26
  st.sidebar.error(f"The CSV file must contain a column named '{col}'.")
27
  return
28
 
29
- # 4. Create a dropdown list based on unique values in the 'model' column
30
  model_options = data_df["model"].unique().tolist()
31
  selected_model = st.sidebar.selectbox("Select a Model:", model_options)
32
 
33
- # 5. Filter the data for the selected model
34
  model_data = data_df[data_df["model"] == selected_model].iloc[0]
35
 
36
- # 6. Dynamically select the background image based on the score
37
  try:
38
- score = int(model_data["score"]) # Convert to int to avoid issues
39
  background_path = f"{score}.png" # E.g., "1.png", "2.png"
40
  background = Image.open(background_path).convert("RGBA")
41
  except FileNotFoundError:
@@ -45,13 +45,13 @@ def main():
45
  st.sidebar.error(f"Invalid score '{model_data['score']}'. Score must be an integer.")
46
  return
47
 
48
- # 7. Overlay the data on the image
49
  generated_label = create_label(background, model_data)
50
 
51
- # 8. Display the generated label in the main area
52
  st.image(generated_label, caption="Generated Label Preview")
53
 
54
- # 9. Provide a download button in the sidebar
55
  img_buffer = io.BytesIO()
56
  generated_label.save(img_buffer, format="PNG")
57
  img_buffer.seek(0)
@@ -65,26 +65,25 @@ def main():
65
 
66
  def create_label(background_image, model_data):
67
  """
68
- This function takes a background image and a row (model_data) from the CSV,
69
- then draws text on the image. Finally, returns the modified image object.
70
  """
71
  label_img = background_image.convert("RGBA")
72
  draw = ImageDraw.Draw(label_img)
73
 
74
- # Load the Inter variable font
75
  try:
76
  inter_font_path = "Inter-VariableFont_opsz,wght.ttf"
77
- title_font = ImageFont.truetype(inter_font_path, 16, layout_engine=ImageFont.LAYOUT_RAQM)
78
- details_font = ImageFont.truetype(inter_font_path, 12, layout_engine=ImageFont.LAYOUT_RAQM)
79
- energy_font = ImageFont.truetype(inter_font_path, 14, layout_engine=ImageFont.LAYOUT_RAQM)
80
  except Exception as e:
81
  st.error(f"Font loading failed: {e}")
82
  return label_img
83
 
84
- # Define positions for the text groups (easy to tweak!)
85
- title_x, title_y = 20, 20 # Position for title group
86
- details_x, details_y = 300, 20 # Position for details group
87
- energy_x, energy_y = 150, 400 # Position for energy group
88
 
89
  # Group 1: Title (Left-Justified)
90
  draw.text((title_x, title_y), f"Model: {model_data['model']}", font=title_font, fill="black")
@@ -97,11 +96,13 @@ def create_label(background_image, model_data):
97
  f"Hardware: {model_data['hardware']}"
98
  ]
99
  for i, line in enumerate(details_lines):
100
- draw.text((details_x, details_y + i * 20), line, font=details_font, fill="black", anchor="ra")
 
101
 
102
  # Group 3: Energy (Bottom-Center)
103
  energy_text = f"Energy: {model_data['energy']}"
104
- draw.text((energy_x, energy_y), energy_text, font=energy_font, fill="black")
 
105
 
106
  return label_img
107
 
 
4
  import io
5
 
6
  def main():
7
+ # Sidebar for dropdown, buttons, and instructions
8
  st.sidebar.title("AI Energy Score Label Generator")
9
  st.sidebar.write("### Instructions:")
10
  st.sidebar.write("1. Select a model from the dropdown.")
 
12
  st.sidebar.write("3. Download the label as a PNG.")
13
  st.sidebar.markdown("[Learn more about AI Energy Scores](https://example.com)")
14
 
15
+ # Read Data from CSV
16
  try:
17
  data_df = pd.read_csv("data.csv")
18
  except FileNotFoundError:
19
  st.sidebar.error("Could not find 'data.csv'! Please make sure it's present.")
20
  return
21
 
22
+ # Ensure the CSV has required columns
23
  required_columns = ["model", "provider", "date", "task", "hardware", "energy", "score"]
24
  for col in required_columns:
25
  if col not in data_df.columns:
26
  st.sidebar.error(f"The CSV file must contain a column named '{col}'.")
27
  return
28
 
29
+ # Dropdown for selecting a model
30
  model_options = data_df["model"].unique().tolist()
31
  selected_model = st.sidebar.selectbox("Select a Model:", model_options)
32
 
33
+ # Filter the data for the selected model
34
  model_data = data_df[data_df["model"] == selected_model].iloc[0]
35
 
36
+ # Dynamically select the background image based on the score
37
  try:
38
+ score = int(model_data["score"]) # Convert to int
39
  background_path = f"{score}.png" # E.g., "1.png", "2.png"
40
  background = Image.open(background_path).convert("RGBA")
41
  except FileNotFoundError:
 
45
  st.sidebar.error(f"Invalid score '{model_data['score']}'. Score must be an integer.")
46
  return
47
 
48
+ # Generate the label with text
49
  generated_label = create_label(background, model_data)
50
 
51
+ # Display the label
52
  st.image(generated_label, caption="Generated Label Preview")
53
 
54
+ # Download button for the label
55
  img_buffer = io.BytesIO()
56
  generated_label.save(img_buffer, format="PNG")
57
  img_buffer.seek(0)
 
65
 
66
  def create_label(background_image, model_data):
67
  """
68
+ Create the label image by adding text from model_data to the background image.
 
69
  """
70
  label_img = background_image.convert("RGBA")
71
  draw = ImageDraw.Draw(label_img)
72
 
73
+ # Load the Inter variable font (no LAYOUT_RAQM)
74
  try:
75
  inter_font_path = "Inter-VariableFont_opsz,wght.ttf"
76
+ title_font = ImageFont.truetype(inter_font_path, 16) # Bold for title
77
+ details_font = ImageFont.truetype(inter_font_path, 12) # Medium for details
78
+ energy_font = ImageFont.truetype(inter_font_path, 14) # Medium for energy
79
  except Exception as e:
80
  st.error(f"Font loading failed: {e}")
81
  return label_img
82
 
83
+ # Define positions for each text group
84
+ title_x, title_y = 20, 20 # Top-left corner for title
85
+ details_x, details_y = label_img.width - 20, 20 # Top-right corner for details
86
+ energy_x, energy_y = label_img.width // 2, label_img.height - 50 # Center-bottom for energy
87
 
88
  # Group 1: Title (Left-Justified)
89
  draw.text((title_x, title_y), f"Model: {model_data['model']}", font=title_font, fill="black")
 
96
  f"Hardware: {model_data['hardware']}"
97
  ]
98
  for i, line in enumerate(details_lines):
99
+ text_width, _ = draw.textsize(line, font=details_font)
100
+ draw.text((details_x - text_width, details_y + i * 20), line, font=details_font, fill="black")
101
 
102
  # Group 3: Energy (Bottom-Center)
103
  energy_text = f"Energy: {model_data['energy']}"
104
+ energy_text_width, _ = draw.textsize(energy_text, font=energy_font)
105
+ draw.text((energy_x - energy_text_width // 2, energy_y), energy_text, font=energy_font, fill="black")
106
 
107
  return label_img
108